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:
- reflect.ValueOf: Dapatkan pantulan nilai objek. objek;
- reflect.TypeOf: Dapatkan objek jenis refleksi bagi objek;
Kaedah: Panggil kaedah dan kembalikan hasilnya. -
- Contoh kaedah panggilan refleksi asas
Mari kita lihat contoh kaedah panggilan refleksi asas.
Andaikan kita mempunyai jenis struktur Person:
type Person struct {
Name string
Age int
Salin selepas log masuk
}
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)
Salin selepas log masuk
}
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)
Salin selepas log masuk
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")
Salin selepas log masuk
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())
Salin selepas log masuk
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 refleksi
Sekarang 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
Salin selepas log masuk
Salin selepas log masuk
}
Kami kemudiannya Tentukan a Taip FlashDisk dan laksanakan dua kaedah antara muka UsbDevice:
taip struct FlashDisk {
Name string
Salin selepas log masuk
Salin selepas log masuk
}
ralat Func (f *FlashDisk) Connect() {
fmt.Printf("%s 连接成功
Salin selepas log masuk
Salin selepas log masuk
", f.Name)
return nil
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
}
func (f *FlashDisk) Disconnect() ralat {
fmt.Printf("%s 断开连接
Salin selepas log masuk
Salin selepas log masuk
", f.Name)
return nil
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
}
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)
Salin selepas log masuk
}
Seterusnya, kita Anda perlu mendapatkan objek kaedah pantulan bagi kaedah Sambung dan Putuskan sambungan:
connectMethod := value.MethodByName("Connect")
disconnectMethod := value.MethodByName("Disconnect")
Salin selepas log masuk
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)
Salin selepas log masuk
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 utama
import (
"fmt"
"reflect"
Salin selepas log masuk
)
taip antara muka Peranti Usb {
Connect() error
Disconnect() error
Salin selepas log masuk
Salin selepas log masuk
}
taip struct FlashDisk {
Name string
Salin selepas log masuk
Salin selepas log masuk
}
ralat func (f *FlashDisk) Connect() {
fmt.Printf("%s 连接成功
Salin selepas log masuk
Salin selepas log masuk
", f .Nama)
return nil
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
}
func (f *FlashDisk) Disconnect() ralat {
fmt.Printf("%s 断开连接
Salin selepas log masuk
Salin selepas log masuk
", f.Name)
return nil
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
Salin selepas log masuk
}
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)
Salin selepas log masuk
}
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.
Ringkasan
Artikel ini menunjukkan cara menggunakan kaedah refleksi untuk memanggil melalui contoh lengkap, terutamanya menggunakan kaedah ValueOf, TypeOf, MethodByName dan Call dalam pakej reflect. Kita boleh menggunakan kaedah ini untuk mendapatkan nilai, jenis, kaedah, dsb. objek secara dinamik dan memanggil kaedah objek secara dinamik pada masa jalan. Perlu diingat bahawa kaedah panggilan pantulan perlu terlebih dahulu memastikan bahawa kaedah yang ditentukan wujud dalam objek, jika tidak, panggilan itu akan mengembalikan pantulan nilai sifar. Nilai{}. Kaedah panggilan refleksi sangat berguna dalam situasi tertentu dan boleh membantu kami melaksanakan beberapa pelaksanaan kod biasa dan pelaksanaan rangka kerja.
Atas ialah kandungan terperinci kaedah panggilan refleksi golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!