Rumah >pembangunan bahagian belakang >Golang >Mengapa Saya Mendapat Ralat 'Kaedah Tidak Ditakrifkan' Semasa Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?
Kaedah Memanggil pada Penunjuk Antara Muka di Golang
Apabila bekerja dengan perpustakaan Gorp untuk akses pangkalan data, pembangun sering menghadapi keperluan untuk memanggil kaedah pada penunjuk antara muka sambil mengekalkan keupayaan untuk melancarkan urus niaga. Isu ini timbul daripada keperluan untuk meluluskan contoh Gorp DbMap atau Transaction sebagai sifat medan.
Masalahnya
Seperti yang ditunjukkan dalam kod contoh, cuba memanggil kaedah pada antara muka SqlExecutor menggunakan rujukan penuding menghasilkan ralat kaedah yang tidak ditentukan. Ini berlaku kerana jenis *gorp.SqlExecutor tidak mempunyai kaedah Dapatkan, manakala antara muka gorp.SqlExecutor itu sendiri.
Penyelesaian
Kesalahpahaman yang mendasarinya terletak pada andaian bahawa menghantar penunjuk kepada nilai antara muka memberikan kelakuan yang sama seperti panggilan melalui rujukan dalam bahasa lain. Dalam Go, penunjuk kepada antara muka digunakan untuk dua sebab tertentu:
Kedua-dua sebab ini tidak terpakai pada penunjuk kepada antara muka, kerana nilai antara muka sudah kecil dan tidak boleh diubah suai melalui nilai antara muka itu sendiri. Sebaliknya, adalah perlu untuk mengubah suai nilai yang disimpan di dalam nilai antara muka, yang selalunya penunjuk kepada struktur sebenar.
Pelaksanaan Betul
Untuk menyelesaikan isu, kod harus mengelak daripada menghantar penunjuk kepada "objek" Gorp dan sebaliknya lulus nilai antara muka secara langsung. Kod berikut melaksanakan pendekatan ini dengan betul:
package repositories import "github.com/coopernurse/gorp" type Repository struct { Gorp gorp.SqlExecutor // Pass the interface value directly } func (r Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
Dengan menghantar nilai antara muka mengikut nilai dan bukan dengan rujukan, kod boleh mengekalkan kefungsian yang diperlukan sambil mematuhi penggunaan penunjuk yang betul dalam Go.
Atas ialah kandungan terperinci Mengapa Saya Mendapat Ralat 'Kaedah Tidak Ditakrifkan' Semasa Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!