マップから取得したスライスに直接追加することは、理解するのが難しい作業になる可能性があります。問題とその解決策について詳しく見ていきましょう。
提供されたコードでは、マップに格納されているスライスに追加しようとしました:
<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 サイトの他の関連記事を参照してください。