go - Go中的短路评估

标签 go short-circuiting

我对短路评估的理解是,只有在 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/

相关文章:

docker - Golang Docker Selenium Chrome

json - 将 interface{} 编码为 json

Python - 短路奇怪的行为

mysql - MySQL 短路 IF() 函数吗?

compiler-construction - 验证OCaml函数是否为尾递归

JavaScript短路评估错误?

pointers - 传递给nil的方法时,Golang指针未更新

go - 使用client-go删除所有kubernetes资源?

pdf - 如何在创建 pdf 时使用呈现的模板