访问地图中的切片值
使用包含切片作为值的地图时,了解直接附加到的含义至关重要地图访问器返回的切片。如下面的示例所示,简单地将附加切片分配给返回的切片不会修改映射中的基础值。
<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中文网其他相关文章!