Go代码条件判断疑问:是编译器Bug还是代码逻辑错误?
问题分析与解决
核心问题:逻辑运算符使用错误
嘿,这绝对不是编译器Bug,是你写的条件判断逻辑出问题啦!
看你这段代码里的判断:
if contentType != "image/jpeg" || contentType != "image/png" { return }
这个逻辑永远都会返回true,不管contentType是什么值:
- 如果
contentType是"image/jpeg",那contentType != "image/png"为真,整个||表达式结果为真,直接执行return - 如果
contentType是"image/png",那contentType != "image/jpeg"为真,同样会触发return - 要是其他类型,两个条件都为真,自然也会直接返回
说白了,不管用户传的是合法的jpg/png,还是其他文件,这段代码都会直接终止,后面的逻辑根本没机会执行。
正确的写法
你需要把逻辑运算符改成&&,意思是既不是jpeg也不是png的时候才返回:
if contentType != "image/jpeg" && contentType != "image/png" { return }
或者用更直观的方式,先定义允许的类型集合再判断:
allowedTypes := map[string]bool{ "image/jpeg": true, "image/png": true, } if !allowedTypes[contentType] { return }
当然你原来的else if写法是没问题的,因为它是互斥判断,只会在类型不是jpeg的时候再检查是不是png,逻辑是通顺的。
小提醒
虽然你为了简洁去掉了错误处理,但实际开发里可不能这么干哦!FormFile、Open、Read这些操作都可能抛出错误,忽略它们会埋下不少隐患。
内容的提问来源于stack exchange,提问作者jayD




