直接附加到從地圖檢索的切片可能是一項很難理解的任務。讓我們深入探討這個問題及其解決方案。
在提供的程式碼中,嘗試追加到儲存在地圖中的切片:
<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中文網其他相關文章!