首頁  >  文章  >  後端開發  >  為什麼追加到 Go Map 找到的切片需要重新分配?

為什麼追加到 Go Map 找到的切片需要重新分配?

Barbara Streisand
Barbara Streisand原創
2024-11-05 06:41:02311瀏覽

Why Does Appending to a Slice Found in a Go Map Require Reassignment?

直接附加到 Go 地圖中找到的切片

直接附加到從地圖檢索的切片可能是一項很難理解的任務。讓我們深入探討這個問題及其解決方案。

在提供的程式碼中,嘗試追加到儲存在地圖中的切片:

<code class="go">mappedAminoAcid, ok := aminoAcidsToCodons[aminoAcid]
if ok {
    // NOT WORKING: mappedAminoAcid = append(mappedAminoAcid, codon)
    aminoAcidsToCodons[aminoAcid] = append(mappedAminoAcid, codon)
}</code>

但是,此操作失敗,因為追加返回如果底層陣列需要成長,則建立一個新切片。因此,有必要將新切片指派回映射條目。

以下是直接分配不起作用的原因:

當切片由函數傳回或從映射存取時,它是原始切片的副本,而不是指標。對副本所做的修改不會反映在原始文件中。

例如,考慮一個字串:

<code class="go">x := "foo"
y := x
y = "bar"
fmt.Println(x) // "foo" (unchanged)</code>

由於可以接受nil 切片作為追加的初始參數,因此程式碼可以簡化一下:

<code class="go">aminoAcidsToCodons := map[rune][]string{}
for codon, aminoAcid := range utils.CodonsToAminoAcid {
    aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon)
}</code>

總之,當附加到從映射檢索的切片時,記住返回的切片是一個副本,並將新切片分配回映射條目是至關重要的。

以上是為什麼追加到 Go Map 找到的切片需要重新分配?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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