首頁  >  文章  >  後端開發  >  如何在 Go 中修改 Map 中的切片值?

如何在 Go 中修改 Map 中的切片值?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-11-05 01:57:02550瀏覽

How to Modify Slice Values in a Map in Go?

訪問地圖中的切片值

使用包含切片作為值的地圖時,了解直接附加到的含​​義至關重要地圖訪問器返回的切片。如下面的範例所示,簡單地將附加切片指派給傳回的切片不會修改映射中的基礎值。

<code class="go">var aminoAcidsToCodons map[rune][]string
for codon, aminoAcid := range utils.CodonsToAminoAcid {
    mappedAminoAcid := aminoAcidsToCodons[aminoAcid] // Return slice by value

    if ok := len(mappedAminoAcid) > 0; ok { // Check if slice is nil
        mappedAminoAcid = append(mappedAminoAcid, codon) // Create a new slice
        aminoAcidsToCodons[aminoAcid] = mappedAminoAcid // Reset map value
    } else {
        aminoAcidsToCodons[aminoAcid] = []string{codon}
    }
}</code>

問題源自於以下事實:如果底層值是附加的,則附加會傳回一個新切片數組需要成長。因此,以下程式碼無法如預期般運作:

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

此行為與字串類似。例如:

<code class="go">var x map[string]string
x["a"] = "foo"

y := x["a"] // Copy string by value
y = "bar"

// x["a"] is still "foo" since a new string is created in y</code>

要解決此問題並修改映射的基礎值,必須將附加切片重新指派給對應的映射條目。幸運的是,有一個更簡單的方法:利用 nil 切片是追加的有效第一個參數。

<code class="go">aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon)</code>

以上是如何在 Go 中修改 Map 中的切片值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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