首頁 > 後端開發 > Golang > 為什麼Go中全域錯誤變數初始化失敗?

為什麼Go中全域錯誤變數初始化失敗?

Barbara Streisand
發布: 2024-12-14 14:51:18
原創
628 人瀏覽過

Why Does Global Error Variable Initialization Fail in Go?

全域錯誤變數初始化失敗

在Go 程式中,全域初始化錯誤變數會帶來一個特殊問題,即它在同一包中的其他功能。為了解開這個謎團,讓我們深入研究一個具體的例子:

package main<p>import (</p><pre class="brush:php;toolbar:false">"os"
"fmt"
登入後複製

)

var loadErr錯誤

func main() {

f, loadErr := os.Open("asdasd")
if loadErr != nil {
    checkErr()
}
if f != nil {
    fmt.Println(f.Name())
}
登入後複製

}

//不會呼叫panic,因為loadErr為nil
func checkErr() {

if loadErr != nil {
    panic(loadErr)
}
登入後複製

}
}

在這種情況下,您自然會期望程式碼當檔案無法開啟時發生恐慌。然而,與預期相反,由於 loadErr 變數為零,它保持沉默。為了解決這個問題,必須做出一個關鍵的區別。

在 Go 中,當使用 := 運算子時,會在函數範圍內建立一個新的局部變數。在本例中,行:

f, loadErr := os.Open("asdasd")
登入後複製

本質上建構了一個名為loadErr 的局部變數,不同來自全域聲明的變數。不幸的是,全域變數不受影響,導致 nil 值難題。

要解決此問題,必須將 := 運算子替換為標準賦值運算子 =。這確保了全域變數 loadErr 被引用並使用 os.Open() 傳回的值進行初始化:

func main() {<pre class="brush:php;toolbar:false">_, loadErr = os.Open("asdasd")
登入後複製

> ;

透過進行這個細微的更改,可以正確設定全域錯誤變量,並且恐慌函數現在的行為如下

此外,如果您需要os.Open() 的兩個回傳值,則必須事先明確宣告賦值中使用的第二個變數:


var f *os .File<br>f, loadErr = os.Open("asdasd")
登入後複製

以上是為什麼Go中全域錯誤變數初始化失敗?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板