Melampirkan terus pada hirisan yang diambil daripada peta boleh menjadi tugas yang sukar untuk difahami. Mari kita selami isu dan penyelesaiannya.
Dalam kod yang disediakan, percubaan telah dibuat untuk menambah pada kepingan yang disimpan dalam peta:
<code class="go">mappedAminoAcid, ok := aminoAcidsToCodons[aminoAcid] if ok { // NOT WORKING: mappedAminoAcid = append(mappedAminoAcid, codon) aminoAcidsToCodons[aminoAcid] = append(mappedAminoAcid, codon) }</code>
Walau bagaimanapun, ini gagal kerana append mengembalikan kepingan baharu jika tatasusunan asas perlu berkembang. Oleh itu, adalah perlu untuk menetapkan semula kepingan baharu kepada entri peta.
Inilah sebabnya pemberian terus tidak berfungsi:
Apabila hirisan dikembalikan oleh fungsi atau diakses daripada peta, ia adalah salinan hirisan asal, bukan penunjuk. Pengubahsuaian yang dibuat pada salinan tidak ditunjukkan dalam yang asal.
Sebagai contoh, pertimbangkan rentetan:
<code class="go">x := "foo" y := x y = "bar" fmt.Println(x) // "foo" (unchanged)</code>
Memandangkan hirisan nol boleh diterima sebagai hujah awal untuk ditambahkan, kod boleh dipermudahkan:
<code class="go">aminoAcidsToCodons := map[rune][]string{} for codon, aminoAcid := range utils.CodonsToAminoAcid { aminoAcidsToCodons[aminoAcid] = append(aminoAcidsToCodons[aminoAcid], codon) }</code>
Ringkasnya, apabila melampirkan hirisan yang diambil daripada peta, adalah penting untuk diingat bahawa kepingan yang dikembalikan ialah salinan dan untuk menetapkan semula kepingan baharu kepada entri peta.
Atas ialah kandungan terperinci Mengapakah Melampirkan Pada Slice yang Ditemui dalam Peta Go Memerlukan Penugasan Semula?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!