Melalui Peta mengikut Nilai lwn. Penunjuk dalam Go
Dalam Go, lulus dengan nilai dan dengan penunjuk boleh mengelirukan, terutamanya apabila berurusan dengan jenis peta. Artikel ini menangani isu mengindeks peta yang diluluskan oleh penuding, yang membawa kepada ralat penyusunan.
Masalahnya
Apabila cuba menghantar peta dengan penuding dan mengubah suainya nilai, Go menimbulkan ralat yang jenis itu tidak menyokong pengindeksan. Ini kerana pengindeksan pada penuding tidak disokong untuk peta.
Penyelesaian
Untuk mengelakkan ralat ini, nyahrujuk penuding sebelum mengindeks peta. Daripada b[amount.Currency], gunakan (*b)[amount.Currency].
Perbincangan Lanjut
Secara lalai, jenis mudah seperti integer diluluskan oleh nilai, manakala struct dan antara muka diluluskan dengan rujukan. Walau bagaimanapun, ini tidak berlaku untuk peta. Peta dihantar melalui rujukan secara lalai, jadi menghantarnya melalui nilai atau penuding pada asasnya adalah sama.
Dalam contoh di atas, menggunakan penerima penuding untuk kaedah Tambah adalah tidak perlu kerana peta sudah diluluskan melalui rujukan. Kaedah ini boleh ditulis seperti berikut tanpa kehilangan kefungsian:
func (b Balance) Add(amount Amount) Balance { current, ok := b[amount.Currency] if ok { b[amount.Currency] = current + amount.Value } else { b[amount.Currency] = amount.Value } return b }
Ringkasnya, apabila bekerja dengan peta, tidak perlu menghantarnya melalui penunjuk untuk mengelakkan penyalinan. Melepasi nilai mencapai hasil yang sama tanpa perlu membuat rujukan.
Atas ialah kandungan terperinci Mengapa Mengindeks Peta yang Dilalui oleh Penunjuk dalam Go Menyebabkan Ralat Penyusunan?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!