Rumah >pembangunan bahagian belakang >Golang >Bagaimana Cara Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?
Kaedah Memanggil pada Penunjuk Antara Muka dalam Go
Dalam Go, apabila pengaturcaraan terhadap antara muka, anda mungkin menghadapi situasi di mana anda perlu dapat kaedah panggilan pada penunjuk kepada nilai antara muka. Ini boleh timbul dalam kes di mana anda ingin mengakses kaedah asas yang tidak didedahkan secara langsung oleh antara muka itu sendiri.
Pertimbangkan senario berikut:
package main import "fmt" // SqlExecutor interface type SqlExecutor interface { Get(i interface{}, key interface{}) (interface{}, error) } // GorpDbMap and GorpTransaction implement SqlExecutor type GorpDbMap struct{} type GorpTransaction struct{} func (db GorpDbMap) Get(i interface{}, key interface{}) (interface{}, error) { return nil, nil } func (tx GorpTransaction) Get(i interface{}, key interface{}) (interface{}, error) { return nil, nil } func main() { // Initialize a GorpDbMap or GorpTransaction dbMap := GorpDbMap{} transaction := GorpTransaction{} // Create a repository that uses the SqlExecutor interface repo := Repository{ // This will result in an error Gorp: &dbMap, } // Try to call Get method on the pointer to the SqlExecutor interface obj, err := repo.GetById(1, 2) if err != nil { fmt.Println(err) } fmt.Println(obj) } // Repository demonstrates calling methods on interface pointers type Repository struct { Gorp SqlExecutor } func (r Repository) GetById(i interface{}, key interface{}) interface{} { obj, err := r.Gorp.Get(i, key) if err != nil { panic(err) } return obj }
Apabila menjalankan kod di atas, anda akan menghadapi ralat berikut:
r.Gorp.Get undefined (type *gorp.SqlExecutor has no field or method Get)
Ralat ini berlaku kerana penunjuk kepada nilai antara muka SqlExecutor tidak berfungsi dengan betul dinyahrujuk sebelum memanggil kaedah Dapatkan.
Untuk menyelesaikan isu ini, anda perlu menyahrujuk penuding kepada nilai antara muka dengan menggunakan pengendali asterisk (*). Ini boleh dicapai dengan mengubah suai kod seperti berikut:
func main() { // Initialize a GorpDbMap or GorpTransaction dbMap := GorpDbMap{} transaction := GorpTransaction{} // Create a repository that uses the SqlExecutor interface repo := Repository{ Gorp: &dbMap, } // Try to call Get method on the pointer to the SqlExecutor interface obj, err := (*repo.Gorp).Get(1, 2) if err != nil { fmt.Println(err) } fmt.Println(obj) }
Dengan mendereferencing penuding kepada nilai antara muka, anda kini boleh mengakses kaedah asas struct yang melaksanakan antara muka. Dalam kes ini, kaedah Dapatkan struct GorpDbMap berjaya dipanggil.
Adalah penting untuk ambil perhatian bahawa dalam Go, biasanya disyorkan untuk memihak kepada menghantar nilai mengikut nilai berbanding menghantar penunjuk kepada nilai. Ini membantu mengelakkan pengubahsuaian yang tidak disengajakan kepada nilai asal. Dalam kes antara muka, anda biasanya harus menghantar nilai antara muka itu sendiri, bukannya penunjuk kepada nilai antara muka.
Atas ialah kandungan terperinci Bagaimana Cara Memanggil Kaedah pada Penunjuk Antara Muka dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!