訪問地圖中的切片值
使用包含切片作為值的地圖時,了解直接附加到的含義至關重要地圖訪問器返回的切片。如下面的範例所示,簡單地將附加切片指派給傳回的切片不會修改映射中的基礎值。
<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中文網其他相關文章!