Go でマップ内のスライス値を変更するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-11-05 01:57:02
オリジナル
588 人が閲覧しました

How to Modify Slice Values in a Map in Go?

マップ内のスライス値へのアクセス

値としてスライスを含むマップを操作する場合、への直接追加の影響を理解することが重要です。マップ アクセサーによって返されたスライス。以下の例に示すように、追加されたスライスを返されたスライスに割り当てるだけでは、マップ内の基になる値は変更されません。

<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 スライスが append の有効な最初の引数であるという事実を利用します。

<code class="go">aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon)</code>
ログイン後にコピー

以上がGo でマップ内のスライス値を変更するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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