當嘗試全域初始化錯誤變數時,有些使用者可能會遇到一個令人費解的問題,即該變數在後續函數中仍然為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中文網其他相關文章!