Bagaimanakah saya boleh menukar jenis penunjuk dan nilai pembolehubah antara muka menggunakan pantulan dalam Go?

DDD
Lepaskan: 2024-11-17 11:05:02
asal
588 orang telah melayarinya

How can I change the pointer type and value of an interface variable using reflection in Go?

Menukar Jenis dan Nilai Penunjuk di bawah Antara Muka dengan Refleksi

Soalan

Bagaimana kita boleh menukar jenis dan nilai penunjuk pembolehubah yang ditakrifkan oleh antara muka menggunakan pantulan?

Jawapan

Dalam Go, semuanya diluluskan oleh nilai, termasuk antara muka. Apabila memberikan nilai antara muka, salinan dibuat, mengehadkan potensi pengubahsuaian.

Untuk mengubah suai nilai yang disimpan dalam pembolehubah antara muka, alamatnya mesti digunakan. Dengan mengakses alamat pembolehubah melalui reflect.ValueOf(&varName).Elem(), kita boleh menetapkan nilai penuding baharu ke dalamnya.

Contoh

var a fmt.Stringer // Interface variable
a = &Greeter{"John"}

v := reflect.ValueOf(&a).Elem() // Access variable's address
v.Set(reflect.ValueOf(&Greeter2{"Jack"})) // Set new pointer value

fmt.Println(a.String()) // Hello2, My name is Jack (Greeter2.String() called)
Salin selepas log masuk

Mata Utama

  • Mulakan dari alamat menggunakan reflect.ValueOf(&varName).
  • Tetapkan nilai penunjuk ke dalamnya, kerana antara muka yang dilaksanakan oleh penunjuk tidak boleh ditetapkan ke dalamnya salinan.

Penghadan

  • Mengubah suai salinan adalah mustahil kerana sifat Go yang pass-by-value. Hanya dengan menghantar penuding nilai yang ditunjuk boleh diubah suai, mengubah nilai pembolehubah dengan berkesan.
  • Menukar jenis antara muka pembolehubah tidak boleh dilakukan, kerana jenis sebenar pembolehubah ditentukan pada masa penyusunan.

Atas ialah kandungan terperinci Bagaimanakah saya boleh menukar jenis penunjuk dan nilai pembolehubah antara muka menggunakan pantulan 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