Go 中的映射值無法定址
在 Go 中,映射值無法像 C 那樣直接尋址。當嘗試獲取地圖中條目的地址時,這一點變得很明顯。考慮下面的程式碼:
import "fmt" func main() { var mymap = make(map[int]string) mymap[1] = "One" var myptr *string = &mymap[1] fmt.Println(*myptr) // Generates error }
此程式碼會觸發錯誤,指出「無法取得地圖值的位址」。但是,如果在取得其位址之前使用中間字串變數來儲存值,則程式碼運行不會出現問題:
import "fmt" func main() { var mymap = make(map[int]string) mymap[1] = "One" mystring := mymap[1] var myptr *string = &mystring fmt.Println(*myptr) // Works }
為什麼映射值無法定址?
禁止直接定址map值源自於Go中map的內部實作。最有可能的是,它們被實作為一種哈希表。哈希表的動態特性允許插入和刪除,可能會使現有條目的位址無效。
為了防止此類錯誤,Go 阻止了映射值的可尋址性。這確保瞭如果基礎哈希表被重新組織,檢索到的值仍然有效。
間接尋址值
雖然不允許直接尋址映射值,但可以間接尋址允許。這意味著變數可以保存映射條目的值,而不能直接修改該值。考慮以下範例:
var mystring string = mymap[1] // Indirect addressing
這一行將 mymap 中鍵為 1 的條目的值指派給 mystring。對 mymap 的變更將反映在 mystring 中。然而,mystring 是不可變的,嘗試修改它的值會導致錯誤。
結論
Go 中映射值的不可尋址性是一種設計選擇旨在確保從映射檢索的值保持有效,即使底層資料結構被重新組織。此限制可防止在儲存映射條目的位址並隨後修改映射時可能發生的錯誤。雖然它可能無法提供與其他一些程式語言相同的靈活性,但它有助於 Go 映射實現的穩定性和可預測性。
以上是為什麼我不能直接在 Go 中尋址映射值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!