当尝试全局初始化错误变量时,一些用户可能会遇到一个令人费解的问题,即该变量在后续函数中仍然为 nil相同的包,导致意外的程序行为。这个问题源于 Go 中全局变量的初始化方式。
在下面的示例中,目标是初始化全局错误变量 loadErr 并检查另一个函数 checkErr() 中的错误:
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) } }
但是,由于 checkErr() 收到 loadErr 的 nil 值,因此出现了问题。这是因为 main() 中创建的变量(“loadErr := os.Open('asdasd')”)是 main() 中的局部变量,此时全局变量尚未初始化。
要解决此问题,在将值分配给全局变量时,应使用简单的赋值(“=”)而不是声明和初始化(“:=”)变量:
// ... func main() { _, loadErr = os.Open("asdasd") // ^ Replaced := with = if loadErr != nil { checkErr() } // ... }
通过使用“=”运算符,全局变量 loadErr` 被显式分配错误值,确保包内的其他函数可以访问它。
以上是为什么我的 Go Global 错误变量在初始化后仍然为 Nil?的详细内容。更多信息请关注PHP中文网其他相关文章!