Rumah >pembangunan bahagian belakang >Golang >Mengapa Go Throw 'Operasi Tidak Sah: Taip *peta[kunci]nilai Tidak Menyokong Pengindeksan'?
Pergi: Operasi Tidak Sah - Jenis *peta[kunci]nilai Tidak Menyokong Pengindeksan
Latar Belakang:
Mekanisme penunjuk Go boleh mengelirukan, terutamanya apabila bekerja dengan peta. Dalam Go, peta ialah jenis rujukan, bermakna apabila anda menghantar peta mengikut nilai, anda menghantar salinan rujukan, bukan peta sebenar itu sendiri. Walau bagaimanapun, kadangkala kita mungkin perlu mengubah suai peta asal yang dihantar kepada fungsi sebagai hujah.
Isu:
Apabila cuba menghantar peta dengan penuding ke mengubah suai kandungannya, anda mungkin menghadapi ralat berikut:
prog.go:15: invalid operation: b[amount.Currency] (type *Balance does not support indexing)
Ralat ini menunjukkan bahawa anda sedang cuba mengindeks penuding ke peta, yang tidak disokong dalam Go.
Penyelesaian:
Untuk menyelesaikan isu ini, anda perlu membezakan antara mengakses nilai peta dan penuding kepadanya. Berikut ialah cara yang betul untuk melakukannya:
func (b *Balance) Add(amount Amount) *Balance { // Index the *b (pointer to map) to get the map itself current, ok := (*b)[amount.Currency] // Continue modifying the indexed map // ... }
Dengan membatalkan rujukan penunjuk b menggunakan *b, anda mendapat akses kepada peta itu sendiri dan boleh melakukan operasi yang diperlukan padanya.
Pendekatan Alternatif:
Jika peta adalah satu-satunya medan dalam struct anda, seperti yang berlaku dalam contoh ini, anda boleh mengelak daripada menghantarnya dengan penunjuk. Sebaliknya, hantarkannya mengikut nilai seperti yang ditunjukkan dalam kod berikut:
func Add(b Balance, amount Amount) Balance { // ... do your operations on the passed map ... return b }
Go lulus peta secara rujukan secara lalai, jadi walaupun anda menghantarnya mengikut nilai, ia masih dianggap sebagai rujukan secara dalaman dan sebarang perubahan dibuat dalam fungsi ditunjukkan dalam peta asal.
Ingat, apabila bekerja dengan peta, sentiasa bezakan antara mengindeks peta itu sendiri dan penuding ke ia. Ini akan membantu anda mengelakkan ralat seperti yang dihadapi dalam kes ini.
Atas ialah kandungan terperinci Mengapa Go Throw 'Operasi Tidak Sah: Taip *peta[kunci]nilai Tidak Menyokong Pengindeksan'?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!