Directly Appending to a Slice in a Go Map
In Go, you might encounter a scenario where you aim to maintain a map that associates runes with slices and append elements to the corresponding slices. However, directly appending to the slice returned by accessing the map (e.g., mappedAminoAcid = append(mappedAminoAcid, codon)) doesn't work as expected. Instead, you need to use the verbose form of access (aminoAcidsToCodons[aminoAcid] = append(mappedAminoAcid, codon)).
This behavior stems from the way Go handles slices. When you append to a slice using the append function, it returns a new slice if the underlying array needs to grow to accommodate the new element. Therefore, to update the slice stored in the map, you need to assign the new slice back to the map, just like you would with strings.
For example:
<code class="go">var x map[string]string x["a"] = "foo" y := x["a"] y = "bar" // x["a"] is still "foo"</code>
To simplify your code, you can leverage the fact that a nil slice is a valid first argument for append:
<code class="go">aminoAcidsToCodons := map[rune][]string{} for codon, aminoAcid := range utils.CodonsToAminoAcid { aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon) }</code>
By understanding how slices work in Go, you can effectively handle scenarios involving slice appending in maps.
The above is the detailed content of Why Doesn't Directly Appending to a Slice in a Go Map Work as Expected?. For more information, please follow other related articles on the PHP Chinese website!