gpt4 book ai didi

go - 使用 'comma ok' 成语还是返回指针?

转载 作者:IT王子 更新时间:2023-10-29 01:23:24 27 4
gpt4 key购买 nike

考虑以下 Go 代码段:

func sheep() (int, bool) {
return 1, true
}

func main() {
if dolly, ok := sheep() {
//do something
}
}

正如我在 'Effective Go' 上阅读的那样这被称为“逗号 ok”成语。据我所知,这是用来区分“找到”和“未找到”的东西。

同样可以通过以下方式实现:

type Sheep struct {}

func sheep() *Sheep {
return &Sheep{}
}

func main() {
if dolly := sheep(); dolly != nil {
//do something
}
}

后一个例子似乎达到了同样的目的,甚至更好。对于“逗号 ok”示例,赋值仅在 if block 中有效。

也许我遗漏了一些注意事项。哪种模式是首选?为什么?

一个简单的例子:http://play.golang.org/p/ATxvle38iE

最佳答案

在 Go 中,nil 值可能是一个非常好的值。例如,一个 nil slice (几乎)像一个空 slice 一样工作,对于用户定义的指针接收器也是如此。

出于这个原因,comma-ok 或 comma-error 习语通常是首选,因为它明显表明函数的调用者需要显式处理错误情况(或 not-ok)。

因此,当 Sheep 返回值可能无效时,这些是惯用的:

func sheep() (*Sheep, bool) {...}
func sheep() (s *Sheep, ok bool) {...} // Adding names to make it clearer
func sheep() (*Sheep, error) {...}

只有当返回值始终有效时,这才是惯用的:

func sheep() *Sheep {...}

这是 Go 与其他语言不同的地方,nil 返回值可用于表示错误。 comma-ok 和 comma-error 的 Go 习语通过使不处理无效返回值的代码看起来错误来巧妙地解决 nil 指针的“十亿美元错误”。如果您编写惯用的代码,您可以立即看到错误何时被忽略:例如,此处对 s2 的赋值会立即跳出可疑:

s1 := sheep()
s2, _ := sheep()

关于go - 使用 'comma ok' 成语还是返回指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23346636/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com