我对短路评估的理解是,只有在 if 语句中需要时才调用表达式。 Go 遵循这个吗?
例如,平均而言,我会从以下方面获得更好的性能:
if !isValidQueryParams(&queries) || r == nil || len(queries) == 0 {
return "", fmt.Errorf("invalid querystring")
}
...为此:
if r == nil || len(queries) == 0 || !isValidQueryParams(&queries) {
return "", fmt.Errorf("invalid querystring")
}
...因为 isValidQueryParams
是一个比 r == nil
或测试 map 长度有更多开销的函数?
即解释器是否会首先评估 r == nil,看到它是真的而不费心去评估其他条件?
编辑:将短路评估错误地称为惰性评估
最佳答案
感谢 Kostix 和 mkrieger 的回答 - 他们是正确的,我指的是短路评估而不是惰性评估。
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
关于go - Go中的短路评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53722288/