Golang中的冗余与操作:true && true 和冗余或操作:true || true
Golang中的冗余与操作:true && true 和冗余或操作:true || true 也就是说:prog.go:8: 冗余与运算:true && true prog.go:10: 冗余或运算:true || true
这段代码出现了该错误信息:https://play.golang.org/p/pxCdcudFwk8
但程序仍然会执行输出。这些错误信息的含义是什么?为什么说它是冗余的? 为什么它仍然会输出?
package main
import "fmt"
func main() {
if true && true {
fmt.Println("与运算")
}
if true || true {
fmt.Println("或运算")
}
}
更多关于Golang中的冗余与操作:true && true 和冗余或操作:true || true的实战教程也可以访问 https://www.itying.com/category-94-b0.html
有趣。
更多关于Golang中的冗余与操作:true && true 和冗余或操作:true || true的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
可能是因为 go vet 只检查左侧表达式。
RHS是什么?
抱歉,我仔细阅读了好几遍,但还是无法理解您的回答。
我明白了!
这种感觉真是太棒了!
什么是函数调用?
不过我认为我理解了基本概念。
你能告诉我该怎么处理标黄的那一行吗?
既有趣又令人着迷!有趣是因为我理解了你所说的内容,而令人着迷则是因为我实在太喜欢Go语言了!
在我上次的回复中,我回答了NobbZ的首次回应。我重新查阅了100p1n6提供的信息,这次理解得更深入了,但尚未完全掌握。由于时间不足,我不得不暂停,但希望明天能继续研究这个问题。
这不是错误,而是警告。这个警告是多余的,因为一旦结果确定,计算就会停止。
由于你使用了常量,false && whatever 已知总是为假,Go 永远不会查看 whatever;类似地,对于 || 运算符,如果第一个参数为 true 也是如此。
func main() {
fmt.Println("hello world")
}
假设右侧是一个函数调用:
true || createFileAndReturnTrueIfItAlreadyExisted("foo.txt")
这行代码会触发警告,但由于短路求值的特性,它永远不会创建文件。因此 || 及其右侧的表达式是冗余的,你可以将其移除,程序的可观察效果将保持不变。
这被称为短路求值: https://en.wikipedia.org/wiki/Short-circuit_evaluation
请查看以下Go代码以了解另一个操作数是否会被求值: https://play.golang.org/p/9sBTnHm3Rtq
顺便说一句:我很好奇为什么true || false和false && true没有"redundant"消息
感谢前两个回答。我将在回复后立即开始学习之旅。
至于第三个问题,很抱歉我之前表达不够清楚。我不知道该如何表述我的问题。
在很多人的回复中,我会看到这样的内容:
true || createFileAndReturnTrueIfItAlreadyExisted("foo.txt")
它显示在一个黄色的"方框"中。
我不明白该如何处理这样的内容。
这些是代码示例。你应该至少阅读它们,有时它们包含需要你运行的代码,有时它们为你之前发布的代码片段提供补丁,有时它们只是放在那里。
如何处理它们取决于它们所属帖子的上下文。
在那个特定情况下,这只是一个供你阅读的示例,旨在说明那个名称显而易见的函数永远不会被调用,因为 true || anything 总是为真,无论 anything 是什么。
cherilexvold1974:
RHS是什么?
RHS是右侧操作数的缩写。通常用作二元运算中右操作数的名称。左操作数通常称为LHS。
cherilexvold1974:
什么是函数调用?
对函数的调用,例如:
fmt.Println("foo")
但如果你需要问这个问题,你真的应该反复学习教程。这是基础知识。
cherilexvold1974:
你能告诉我该怎么处理高亮显示为黄色的那一行吗?
你具体指的是什么?哪里有高亮显示为黄色的行。
这里存在两种情况。
第一种情况,当你使用 true && true 时,这在逻辑上是冗余的,因为从更广义的角度来看 p && p 等价于 p,所以第二个 p 是多余的。在这种情况下,与 p 是 true 还是 false 无关。这里有一个示例:当计算 a && a 时会收到冗余警告,但计算 a && b 时则不会,尽管 a 和 b 都是 true。可以在 Playground 上查看:https://play.golang.org/p/dzWSf9FEPSU
package main
func main() {
a := true
b := true
if a && a { // 冗余条件
println("a && a")
}
if a && b {
println("a && b")
}
}
第二种情况是 Norbert 提到的。从逻辑上讲,表达式 true || (其他任何内容) 显然为 true,而 false && (其他任何内容) 显然为 false,因此无需计算表达式的其余部分,这使得其余部分成为冗余。
这些是Go编译器的静态检查警告,指出逻辑表达式中的冗余部分。程序仍然会正常执行,因为这些警告不影响代码的语义。
冗余与运算:true && true
true && true 总是等于 true,因此可以直接简化为 true:
// 冗余写法
if true && true {
fmt.Println("与运算")
}
// 简化后
if true {
fmt.Println("与运算")
}
冗余或运算:true || true
true || true 也总是等于 true,可以直接简化为 true:
// 冗余写法
if true || true {
fmt.Println("或运算")
}
// 简化后
if true {
fmt.Println("或运算")
}
为什么程序仍然输出?
这些是编译时警告而非错误,编译器仍然会生成可执行代码。逻辑上,true && true 和 true || true 都等价于 true,所以条件判断成立,相应的代码块被执行。
在实际代码中,这种冗余通常出现在使用常量或预计算表达式时:
const debugMode = true
// 冗余写法
if debugMode && true {
fmt.Println("调试模式")
}
// 应该简化为
if debugMode {
fmt.Println("调试模式")
}
编译器检测到这些冗余操作并发出警告,帮助开发者写出更简洁的代码。


