3 回答
TA贡献2016条经验 获得超9个赞
Go 确实实现了正常的短路评估,可以用以下代码推导出:
package main
import "fmt"
func main() {
for i := 0; i < 10; i++ {
if testFunc(1) || testFunc(2) {
// do nothing
}
}
}
func testFunc(i int) bool {
fmt.Printf("function %d called\n", i)
return true
}
...这将永远给:
$ function 1 called
$ function 1 called
$ function 1 called
$ function 1 called
$ function 1 called
$ function 1 called
$ function 1 called
$ function 1 called
$ function 1 called
$ function 1 called
TA贡献1797条经验 获得超6个赞
这称为短路评估。根据本教程,布尔运算符使用这个:
尽管在Go 语言规范中没有明确说明 Go 使用短路评估,但确实提到了
逻辑运算符应用于布尔值并产生与操作数相同类型的结果。有条件地评估右操作数。
这是一个简单的例子来证明 Go 使用短路评估
[…]
TA贡献1993条经验 获得超5个赞
您所指的是所谓的“短路求值”——也就是说,仅在完整结果可用时才使用正常的关联性规则对子表达式求值,并且对其余表达式的求值不会根据有问题的二元运算符的规则。
Go 确实实现了逻辑表达式的短路评估。
“惰性求值”完全是另一回事——通常在所谓的“函数式”编程语言中实现,并没有直接在 Go 中实现。
话虽如此,我会注意到虽然 Go 没有直接(与语法和运行时一样)支持惰性求值,但可以在需要时使用它。
例如,您可能有一个 goroutine 从通道读取可能无限数量的项目,并以一种或另一种方式处理它们,而另一个 goroutine(或其中的几个)产生这些值并通过通道发送它们。这样,这些值只会在接收端“具体化”,不会比它们实际准备好处理的速度更快。
- 3 回答
- 0 关注
- 154 浏览
添加回答
举报