Menukar Jenis Penunjuk dan Nilai Di Bawah Antara Muka dengan Refleksi
Dalam Go, antara muka mewakili kontrak yang mentakrifkan kaedah tertentu, tetapi tidak menyatakan jenis daripada objek asas. Fleksibiliti ini membolehkan pengikatan dinamik, tetapi juga boleh menimbulkan cabaran apabila cuba mengubah suai jenis penunjuk dan nilai pembolehubah yang ditakrifkan oleh antara muka.
Bolehkah Jenis dan Nilai Penunjuk Ditukar Di Bawah Antara Muka?
Menukar nilai penunjuk di bawah antara muka boleh dilakukan menggunakan pantulan. Dengan menetapkan elemen nilai pantulan kepada elemen nilai penunjuk baharu, nilai boleh diubah suai. Walau bagaimanapun, menukar jenis penunjuk tidak boleh dilakukan secara langsung.
Menggunakan Refleksi untuk Menukar Nilai Penunjuk
Untuk menukar nilai penunjuk pembolehubah yang ditakrifkan oleh antara muka, ikuti ini langkah:
Contoh
Dalam kod berikut, nilai a diubah suai menggunakan refleksi untuk menunjuk ke objek Greeter2 sambil mengemas kini nama ke "Jack":
package main import ( "fmt" "reflect" ) type Greeter struct { Name string } func (g *Greeter) String() string { return "Hello, My name is " + g.Name } type Greeter2 struct { Name string } func (g *Greeter2) String() string { return "Hello2, My name is " + g.Name } func main() { var a fmt.Stringer a = &Greeter{"John"} fmt.Println(a.String()) // Output: Hello, My name is John v := reflect.ValueOf(&a).Elem() v.Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem()) fmt.Println(a.String()) // Output: Hello2, My name is Jack }
Nota: Untuk mengubah suai jenis penuding pembolehubah, ia mesti dihantar melalui alamat. Ini kerana Go menghantar nilai melalui salinan dan hanya penunjuk membenarkan nilai yang ditunjuk diubah suai secara tidak langsung.
Atas ialah kandungan terperinci Bolehkah Anda Mengubah Jenis Penunjuk dan Nilai Pembolehubah yang Ditakrifkan oleh Antara Muka Menggunakan Refleksi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!