首頁  >  文章  >  後端開發  >  為什麼我不能在 Go 中取得映射值的位址?

為什麼我不能在 Go 中取得映射值的位址?

Linda Hamilton
Linda Hamilton原創
2024-11-16 07:24:02435瀏覽

Why can't I take the address of a map value in Go?

在Go 中取得映射值的位址

問題:為什麼我不能取得地圖value?

問題:為什麼我不能取得地圖value?

背景:

Go 程式語言限制使用「&」運算子來取得映射值的位址。此行為與切片值不同,切片值可以使用“&”來解決。

誤解的澄清:

與映射由內存結構支持的信念相反與數組一樣,它們實際上存儲在動態的、重組的存儲桶結構中。這意味著映射值沒有固定的記憶體位置。

根本原因:

Go 禁止取得映射值的位址的主要原因是地圖資料結構的動態性質。當建立、更新或刪除映射條目時,可以重新組織儲存桶以優化效能和記憶體使用。如果地圖值允許使用位址,則它們將在這些重定位過程中失效。

地圖中的數字修改:

儘管「 」和「 =」等運算子可以用於就地修改數字映射值,這種簡寫形式實際上執行一系列不直接存取底層的操作value.

func icandothis() {
    cmap := make(map[int]complex64)
    cmap[1] += complex(1, 0)
    fmt.Println(cmap[1])
}
範例:

func icandothis() {
    cmap := make(map[int]complex64)
    v := cmap[1]
    v += complex(1, 0)
    cmap[1] = v
    fmt.Println(cmap[1])
}

展開簡寫形式表明該操作實際上創建了一個新的臨時值來執行加法並將其儲存回映射中:

修改結構體值映射:

  1. 與數值不同,修改映射中的結構體值需要以下步驟:
  2. 從映射中擷取結構體值。
  3. 修改結構體值。

將修改後的結構體值儲存回map.

type Complex struct {
    R float32
    I float32
}

func (x *Complex) Add(c Complex) {
    x.R += c.R
    x.I += c.I
}

func main() {
    cmap := make(map[int]Complex)
    c := cmap[1]
    c.Add(Complex{1, 0})
    cmap[1] = c
    fmt.Println(cmap[1])
}
範例:

依照以下步驟,可以就地修改結構體值,而不需要其位址。

以上是為什麼我不能在 Go 中取得映射值的位址?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn