空結構體數組比較:了解變數行為
在Go 中比較空結構體數組時,您可能會遇到意想不到的結果。讓我們透過程式碼範例來探索這種行為並理解它發生的原因。
考慮以下程式碼:
var s, ss struct{} // two empty structs arr1 := [6]*struct{}{&s} // array with empty struct pointer arr2 := [6]*struct{}{&ss} // array with empty struct pointer fmt.Println(&s == &ss, arr1 == arr2) // false, true
這裡,我們定義空結構體 s 和 ss,初始化陣列 arr1 和 arr2指向這些結構的指針,並列印比較結果。令人驚訝的是,雖然 &s 和 &ss 不相等,但 arr1 和 arr2 相等。
要理解這一點,我們需要參考 Go 規範。指標值的規範規定,如果它們指向同一個變數或兩者的值為 nil,則它們相等。至關重要的是,它指出指向不同的零大小變數的指標「可能相等,也可能不相等。」
此外,沒有欄位的結構的大小為零。因此, &s 和 &ss 指向不同的零大小變量,並且比較 &s == &ss 的計算結果可能為 true 或 false。
同樣,陣列比較 arr1 == arr2 的行為也無法保證。零大小變數的規格表明它們「可能」在記憶體中具有相同的位址。因此,arr1 和 arr2 可能相等也可能不相等,且結果可能因程式的不同運作而異。
總而言之,比較不同零大小變數(例如空結構)的指標可能會產生不可預測的結果結果。雖然您可能會觀察到一次特定結果,但由於編譯器優化記憶體分配的方式,它在後續運行中可能會有所不同。
以上是為什麼 Go 中的空結構體陣列有時比較相等,儘管它們的指標不同?的詳細內容。更多資訊請關注PHP中文網其他相關文章!