Dalam sistem jenis Go, antara muka mentakrifkan kontrak yang jenis boleh laksanakan untuk mendedahkan gelagat tertentu. Apabila bekerja dengan nilai antara muka, adalah penting untuk memahami cara hantaran nilai dan pantulan dimainkan.
Dalam Go, semua nilai dihantar mengikut nilai, termasuk nilai antara muka. Apabila anda menetapkan nilai antara muka kepada pembolehubah atau menghantarnya kepada fungsi, salinan nilai antara muka dibuat. Salinan ini mengandungi rujukan kepada nilai konkrit asas dan jenis nilai tersebut.
Anda menyebut bahawa anda boleh menukar nilai penunjuk pembolehubah antara muka menggunakan pantulan:
v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem())
Ini berfungsi kerana pantulan menyediakan akses kepada nilai asas yang disimpan dalam antara muka. Dengan memanggil v.Elem(), anda mendapat Nilai pantulan untuk nilai konkrit, yang kemudian anda boleh ubah suai menggunakan Set.
Walau bagaimanapun, soalan anda adalah tentang menukar kedua-dua jenis penunjuk dan nilai pembolehubah antara muka. Malangnya, ini tidak boleh dilakukan menggunakan refleksi mengikut cara yang anda telah terangkan:
v.Elem().Set(reflect.ValueOf(&Greeter2{"Jack"}).Elem())
Apabila anda mencuba ini, anda akan menerima ralat panik kerana Go tidak membenarkan memberikan nilai jenis yang berbeza kepada antara muka nilai. Secara khususnya, Go memerlukan jenis nilai yang diberikan kepada antara muka sepadan dengan jenis antara muka itu sendiri.
Untuk menukar kedua-dua jenis penunjuk dan nilai pembolehubah antara muka , anda perlu membuat pembolehubah jenis yang diingini dahulu dan hantar alamatnya kepada Nilai pantulan. Ini membolehkan anda mengubah suai nilai yang disimpan dalam pembolehubah melalui penuding.
var newGreeter2 = &Greeter2{"Jack"} reflect.ValueOf(&&a).Elem().Set(reflect.ValueOf(newGreeter2))
Dengan menggunakan pendekatan ini, anda boleh menukar kedua-dua jenis dan nilai pembolehubah antara muka dengan berkesan. Walau bagaimanapun, adalah penting untuk ambil perhatian bahawa anda masih menggunakan salinan nilai antara muka, bukan pembolehubah asal itu sendiri.
Atas ialah kandungan terperinci Bolehkah Anda Mengubah Jenis Penunjuk dan Nilai Pembolehubah Antara Muka Menggunakan Refleksi dalam Go?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!