Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimanakah saya boleh menukar jenis penunjuk dan nilai pembolehubah antara muka menggunakan pantulan dalam Go?

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

DDD
DDDasal
2024-11-17 11:05:02581semak imbas

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)

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!

Kenyataan:
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