Rumah > pembangunan bahagian belakang > Golang > Bolehkah Anda Mengubah Jenis Penunjuk dan Nilai Pembolehubah Antara Muka Menggunakan Refleksi dalam Go?

Bolehkah Anda Mengubah Jenis Penunjuk dan Nilai Pembolehubah Antara Muka Menggunakan Refleksi dalam Go?

DDD
Lepaskan: 2024-11-28 16:48:24
asal
941 orang telah melayarinya

Can You Change Both Pointer Type and Value of an Interface Variable Using Reflection in Go?

Menukar Jenis Penunjuk dan Nilai Pembolehubah Antara Muka Menggunakan Refleksi

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.

Lulus Nilai

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.

Menukar Nilai Penunjuk

Anda menyebut bahawa anda boleh menukar nilai penunjuk pembolehubah antara muka menggunakan pantulan:

v.Elem().Set(reflect.ValueOf(&Greeter{"Jack"}).Elem())
Salin selepas log masuk

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.

Menukar Jenis Penunjuk

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())
Salin selepas log masuk

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.

Penyelesaian Menggunakan Penunjuk

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))
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan