全局错误变量在初始化后保持为零:发现差异
考虑以下代码:
package main import ( "os" "fmt" ) var loadErr error func main() { f, loadErr := os.Open("asdasd") if loadErr != nil { checkErr() } if f != nil { fmt.Println(f.Name()) } } // panic won't be called because loadErr is nil func checkErr() { if loadErr != nil { panic(loadErr) } }
令人困惑,即使 loadErr 为 nil,此代码也不会出现恐慌。当 loadErr 不为零时,相同的函数 checkErr() 被定义为恐慌。是什么导致了这种差异?
谜底揭开
问题的根源在于局部变量和全局变量之间的微妙区别。在第一个代码片段中,行:
f, loadErr := os.Open("asdasd")
在 main 函数的范围内创建一个新的本地 loadErr 变量。此局部变量与在任何函数外部声明的全局 loadErr 不同。因此,在整个代码执行过程中,全局 loadErr 保持不变且为 nil。
解决差异
纠正问题并确保全局 loadErr设置,将上面提到的行中的 := 替换为 =:
func main() { _, = os.Open("asdasd")
此更改将 os.Open() 的值直接分配给全局 loadErr,从而将其正确设置为所需的值。
附加说明
如果您希望保留同样是 f 的值,在函数作用域之外预先声明 f:
var f *os.File func main() { f, = os.Open("asdasd")
在这种情况下使用 := 会创建一个局部 f 变量,使全局变量黯然失色。
以上是为什么我的全局错误变量在 Go 中初始化后仍然为 Nil?的详细内容。更多信息请关注PHP中文网其他相关文章!