Rumah >pembangunan bahagian belakang >Golang >kaedah panggilan refleksi golang
Kata Pengantar
Di Golang, mekanisme pantulan merupakan fungsi penting Ia boleh memperoleh jenis dan nilai pembolehubah secara dinamik pada masa jalan, dan boleh memanggil kaedah secara dinamik, terutamanya untuk beberapa tujuan umum Mekanisme pantulan adalah. amat diperlukan untuk pelaksanaan kod tertentu dan pelaksanaan beberapa rangka kerja.
Artikel ini akan menggunakan contoh untuk memperkenalkan cara menggunakan kaedah panggilan refleksi di Golang.
Pengenalan kepada kaedah panggilan pantulan
Kaedah panggilan pantulan merujuk kepada memanggil fungsi objek secara dinamik pada masa jalan Melalui pakej pantulan, anda boleh mendapatkan objek secara dinamik pada masa jalan dan memanggil kaedah objek . Sudah tentu, sebelum memanggil kaedah melalui refleksi, kita perlu melakukan pemprosesan yang diperlukan pada jenis objek, nama kaedah, jenis parameter kaedah, dll.
Dalam Go, kita boleh menggunakan pakej reflect untuk melaksanakan kaedah panggilan refleksi Pakej ini terutamanya menyediakan kaedah penting berikut:
Name string Age int}Sekarang kita mahu memanggil kaedah GetName bagi struktur Person , tetapi kami tidak tahu jenis objek Pada masa ini, kami perlu menggunakan pakej refleksi untuk melaksanakan kaedah panggilan refleksi. Pertama, kita perlu mencipta objek Orang dan mendapatkan objek nilai pantulannya: func main() {
person := &Person{Name: "Alice", Age: 18} value := reflect.ValueOf(person)}reflect.ValueOf ( orang) mengembalikan nilai jenis reflect.Value, iaitu nilai penunjuk yang menunjuk kepada jenis struktur objek Kita boleh menggunakan kod berikut untuk mendapatkan jenis objek:
typ := reflect.TypeOf(person)Dengan cara ini. kita berjaya mendapatkan Selepas mendapat objek nilai pantulan dan objek jenis pantulan objek, kita perlu mendapatkan objek kaedah pantulan kaedah GetName Kodnya adalah seperti berikut:
method := value.MethodByName("GetName")Jika tiada kaedah GetName dalam. objek, kaedah akan mengembalikan nilai sifar mencerminkan.Nilai{ }. Sekarang kita telah memperoleh objek kaedah refleksi kaedah, kita boleh memanggil kaedah dan mendapatkan nilai pulangan:
res := method.Call(nil) fmt.Println(res[0].String())Untuk memanggil kaedah, anda perlu menggunakan kaedah Panggilan, yang menerima senarai parameter ( reflect.Value slice type) dan mengembalikan senarai nilai jenis slice. Memandangkan kaedah GetName tidak lulus dalam parameter, kita boleh lulus dalam keping nol. Contoh lengkap kaedah panggilan refleksiSekarang kita telah memahami cara menggunakan refleksi untuk memanggil kaedah asas, seterusnya kita akan mempelajari kaedah panggilan refleksi dengan lebih mendalam dengan contoh yang lengkap. Kami mentakrifkan antara muka UsbDevice, yang mengandungi dua kaedah, iaitu Connect dan Disconnect: taip antara muka UsbDevice {
Connect() error Disconnect() error}Kami kemudiannya Tentukan a Taip FlashDisk dan laksanakan dua kaedah antara muka UsbDevice: taip struct FlashDisk {
Name string}ralat Func (f *FlashDisk) Connect() {
fmt.Printf("%s 连接成功", f.Name)
return nil}func (f *FlashDisk) Disconnect() ralat {
fmt.Printf("%s 断开连接", f.Name)
return nil}Sekarang kita perlu menggunakan refleksi untuk memanggil kaedah jenis FlashDisk secara dinamik. Pertama, kita perlu mencipta objek FlashDisk dan mendapatkan objek nilai pantulannya: func main() {
flashDisk := &FlashDisk{Name: "闪迪 U 盘"} value := reflect.ValueOf(flashDisk)}Seterusnya, kita Anda perlu mendapatkan objek kaedah pantulan bagi kaedah Sambung dan Putuskan sambungan:
connectMethod := value.MethodByName("Connect") disconnectMethod := value.MethodByName("Disconnect")Perhatikan bahawa di sini kita perlu memastikan bahawa kaedah Sambung dan Putuskan wujud dalam objek, jika tidak, objek kaedah pantulan yang diperoleh di sini akan mengembalikan nilai sifar mencerminkan.Nilai{}. Seterusnya, kami menggunakan kaedah Panggilan untuk memanggil dua kaedah ini:
connectRes := connectMethod.Call(nil) disconnectRes := disconnectMethod.Call(nil)Apabila memanggil kaedah Panggilan, anda perlu memasukkan senarai parameter Memandangkan kaedah Sambung dan Putuskan sambungan tidak mempunyai parameter , kita boleh lulus Masukkan keping nol. Kod lengkap adalah seperti berikut: pakej utamaimport (
"fmt" "reflect")taip antara muka Peranti Usb {
Connect() error Disconnect() error}taip struct FlashDisk {
Name string}ralat func (f *FlashDisk) Connect() {
fmt.Printf("%s 连接成功", f .Nama)
return nil}func (f *FlashDisk) Disconnect() ralat {
fmt.Printf("%s 断开连接", f.Name)
return nil}func main() {
flashDisk := &FlashDisk{Name: "闪迪 U 盘"} fmt.Println("使用反射调用方法:") value := reflect.ValueOf(flashDisk) connectMethod := value.MethodByName("Connect") disconnectMethod := value.MethodByName("Disconnect") connectRes := connectMethod.Call(nil) disconnectRes := disconnectMethod.Call(nil) fmt.Println(connectRes) fmt.Println(disconnectRes)}Jalankan program di atas, hasil output ialah: Gunakan kaedah panggilan refleksi:
SanDisk U sambungan cakera berjaya
[][]
Pada ketika ini, kami telah berjaya menggunakan refleksi untuk memanggil kaedah Sambung dan Putuskan sambungan jenis FlashDisk.
Atas ialah kandungan terperinci kaedah panggilan refleksi golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!