ホームページ >バックエンド開発 >Golang >Go マップのスライスに直接追加できないのはなぜですか?

Go マップのスライスに直接追加できないのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-07 14:38:02820ブラウズ

Why Can't I Append Directly to a Slice in a Go Map?

Go: マップ内で見つかったスライスに直接追加できないのはなぜですか?

Go では、マップを操作するときに、マップ内の既存のスライスに値を追加する必要がある状況が発生する場合があります。ただし、アクセスして返されたスライスに直接追加しようとすると、変更が保存されない可能性があります。

この問題を説明するには、次のコード部分を考えてみましょう。

<code class="go">aminoAcidsToCodons := map[rune][]string{}
for codon, aminoAcid := range utils.CodonsToAminoAcid {
    mappedAminoAcid := aminoAcidsToCodons[aminoAcid] // Returning a copy of the slice
                                                  // instead of a reference

    // Not working: mappedAminoAcid = append(mappedAminoAcid, codon)

    aminoAcidsToCodons[aminoAcid] = append(mappedAminoAcid, codon) // Using long-form access
}</code>

コメント行では、aminoAcidsToCodons[aminoAcid] によって返されたスライスに直接追加しようとします。ただし、返されるのはマップ内のスライスへの参照ではなく、スライスのコピーであるため、この操作は失敗します。

この動作の理由は、Go での追加の動作方法にあります。スライスの基になる配列の容量を超えると、append は新しいスライスを作成し、そこに既存の要素をコピーします。この新しいスライスは返されますが、元のスライスは変更されません。

したがって、マップ内のスライスに正常に追加するには、追加操作の結果をマップ内の対応するキーに割り当てる必要があります。これは、次の変更コードに見られるように、追加する最初の引数として nil スライスを使用することでさらに簡素化できます:

<code class="go">aminoAcidsToCodons := map[rune][]string{}
for codon, aminoAcid := range utils.CodonsToAminoAcid {
    aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon)
}</code>

以上がGo マップのスライスに直接追加できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。