Go マップで見つかったスライスに追加するには、なぜ再割り当てが必要ですか?

Barbara Streisand
リリース: 2024-11-05 06:41:02
オリジナル
362 人が閲覧しました

Why Does Appending to a Slice Found in a Go Map Require Reassignment?

Go マップで見つかったスライスに直接追加

マップから取得したスライスに直接追加することは、理解するのが難しい作業になる可能性があります。問題とその解決策について詳しく見ていきましょう。

提供されたコードでは、マップに格納されているスライスに追加しようとしました:

<code class="go">mappedAminoAcid, ok := aminoAcidsToCodons[aminoAcid]
if ok {
    // NOT WORKING: mappedAminoAcid = append(mappedAminoAcid, codon)
    aminoAcidsToCodons[aminoAcid] = append(mappedAminoAcid, codon)
}</code>
ログイン後にコピー

しかし、append が返されるため、これは失敗しました。基礎となる配列を拡張する必要がある場合は、新しいスライス。したがって、新しいスライスをマップ エントリに割り当てる必要があります。

直接割り当てが機能しない理由は次のとおりです。

スライスが関数によって返されるか、マップからアクセスされる場合、これはポインタではなく、元のスライスのコピーです。コピーに加えられた変更は、元のコピーには反映されません。

たとえば、次の文字列を考えてみましょう。

<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 マップで見つかったスライスに追加するには、なぜ再割り当てが必要ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート