Rumah > pembangunan bahagian belakang > Golang > kaedah panggilan refleksi golang

kaedah panggilan refleksi golang

WBOY
Lepaskan: 2023-05-15 10:28:37
asal
1217 orang telah melayarinya

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!

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