マップ内のスライス値へのアクセス
値としてスライスを含むマップを操作する場合、への直接追加の影響を理解することが重要です。マップ アクセサーによって返されたスライス。以下の例に示すように、追加されたスライスを返されたスライスに割り当てるだけでは、マップ内の基になる値は変更されません。
<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 サイトの他の関連記事を参照してください。