Menujuk Indeks Peta dalam Go
Apabila memanipulasi nilai dalam peta, adalah penting untuk mengetahui kelakuan penerima penunjuk untuk peta entri. Perangkap biasa timbul apabila cuba memanggil kaedah penerima penunjuk pada indeks peta, seperti yang ditunjukkan oleh kod di bawah:
package main import "fmt" type item struct { itemName string amount int } type Cashier struct { items map[int]item cash int } func (i *item) GetAmount() int { return i.amount } func main() { x := Cashier{} x.AddItem("item1", 13) f := x.GetItems() fmt.Println(f[0].GetAmount()) // Error: cannot call pointer method on f[0] }
Dalam kod ini, kaedah GetAmount ditakrifkan sebagai penerima penunjuk untuk memanipulasi item secara langsung struct. Walau bagaimanapun, apabila anda memanggil f[0].GetAmount(), anda menerima ralat "tidak boleh memanggil kaedah penunjuk pada f[0]". Ini kerana entri peta tidak boleh ditangani secara langsung disebabkan oleh potensi perubahan dalam alamatnya apabila peta berkembang atau mengecut.
Punca gelagat ini terletak pada cara Go melaksanakan peta. Peta diwakili secara dalaman sebagai jadual cincang yang mungkin diubah saiz semasa masa jalan untuk mengoptimumkan prestasi. Akibatnya, alamat entri peta mungkin berubah dari semasa ke semasa, menjadikannya tidak sah untuk dihantar sebagai hujah kepada kaedah penerima penunjuk.
Untuk menyelesaikan isu ini, satu pendekatan adalah dengan mencipta salinan peta entri dan bukannya menggunakan penerima penunjuk. Ini boleh dicapai dengan mula-mula mendapatkan semula nilai daripada peta menggunakan indeks dan kemudian mencipta salinan nilai tersebut:
func main() { x := Cashier{} x.AddItem("item1", 13) f := x.GetItems() itemCopy := f[0] fmt.Println(itemCopy.GetAmount()) // No error }
Dalam kes ini, itemCopy ialah salinan nilai yang disimpan di f[0] , dan ia boleh digunakan untuk memanggil kaedah penerima penunjuk tanpa menghadapi ralat.
Dengan memahami gelagat penerima penunjuk dengan entri peta, pembangun boleh mengelakkan perkara ini perangkap dan tulis kod yang beroperasi dengan betul pada nilai peta.
Atas ialah kandungan terperinci Mengapa Saya Tidak Boleh Memanggil Kaedah Penerima Penunjuk pada Indeks Go Map?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!