我对短路求值的理解是,只有在if语句中需要时才会调用表达式.沿着这个走吗?

例如,我是否会从以下方面获得更好的平均性能:

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 长度开销大得多的函数?

i、 e.解释器会首先计算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相关问答推荐

如何处理Firestore的DataTo方法中的嵌套指针?

Zitadel示例Go Webapp加密密钥

Go在使用HTTP代理时如何处理DNS请求?

Go Regexp:匹配完整的单词或子字符串,或者根本不匹配

错误&对象已被Golang在K8s操作符上修改

Go中的Slice[:1][0]与Slice[0]

如何使redis池的等待超时

有没有办法让sqlc生成可以使用pgxpool的代码

Kusto Go API 从多个表查询

在本地 go 应用程序上获取秘密的正确策略

使用模拟在 golang 中测试我的界面.专门测试调用同级函数的 1 个函数

如何将整数哈希细分为范围

AddE 上的 Apache Tinkerpop gremlin-go 驱动程序 Next() 返回E0903:没有剩余结果

Wire google Inject with multi return from provider 函数

Go cmp - 如何为以 struct 为键的映射定义自定义相等性?

Dockerfile 问题 - 为什么找不到二进制 dlv - 没有这样的文件或目录

在 Go GRPC 服务器流式拦截器上修改元数据

Go 加密库创建的 PKCS1 公钥与openssl rsa ...之间的区别

如何将实际上是类型为 reflect.Int32 的类型切片的 interface{} 转换为 int32 的切片?

如何使用 httputil.ReverseProxy 设置 X-Forwarded-For