gpt4 book ai didi

go - 在 if block 中限定变量范围的优势

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

err 已经发生之后,在 if 语句中确定 second err 的范围是否有优势?在 foo() 的范围内创建?特别是在内存管理或惯用方面。

版本 1

func foo() {
temp, err := something()
if err != nil {
...
}

if err := other(); err != nil {
...
}
}

版本 2

func foo() {
temp, err := something()
if err != nil {
...
}

err = other()
if err != nil {
...
}
}

https://golang.org/doc/effective_go.html#control-structures

最佳答案

记住,error 是一个接口(interface)。 nil 接口(interface)的字节长度为零(空结构也是零长度)。

这意味着 GC 没有额外的工作来清理任何一种方式。

这是个人喜好,甚至还有第三种使用命名返回值的方法:

func foo() (err error) {
...
}

虽然我强烈建议不要使用该模式。

就个人而言,我更喜欢 inline 的惯用性质,当我可以并且在模式允许我使用它时真正享受它。但请记住,其他变量的作用域仅在 if:

中可用
if temp, err := other(); err != nil {
// can only use temp here
...
}

(除非你提前定义了变量,否则无论如何都会破坏内联的目的)

但大多数情况下,我需要在求值后保持temp:

temp, err := something()
if err != nil {
...
}
// continue to use temp

这意味着我的大部分代码都与上面类似。

但是当我遇到允许它的模式时,你打赌我会使用它。比如bufio的Writer.WriteByte:

if err := writer.WriteByte(b); err != nil {
...
}

writerb 是在外部作用域中定义的,很可能有它们自己的 err 检查。在评估范围之外定义 err 是零点。

限制 err 值的范围似乎是惯用的方式,当您可以使用它时。

关于go - 在 if block 中限定变量范围的优势,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37129614/

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