Home  >  Article  >  Backend Development  >  Why Doesn't Directly Appending to a Slice in a Go Map Work as Expected?

Why Doesn't Directly Appending to a Slice in a Go Map Work as Expected?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-11-05 22:42:02148browse

Why Doesn't Directly Appending to a Slice in a Go Map Work as Expected?

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn