Rumah > pembangunan bahagian belakang > Golang > kaedah pemerolehan pantulan golang

kaedah pemerolehan pantulan golang

王林
Lepaskan: 2023-05-14 15:15:08
asal
729 orang telah melayarinya

Dalam bahasa Go, refleksi ialah ciri yang sangat penting. Ia boleh memperoleh jenis, nilai, kaedah dan maklumat pembolehubah lain pada masa jalan, dan melaksanakan banyak fungsi lanjutan, seperti penyirian objek, penjanaan kod automatik, dsb. Antaranya, kaedah mendapatkan objek melalui refleksi juga amat berguna.

Dalam bahasa Go, kita boleh menggunakan struktur Jenis dan Nilai yang disediakan dalam pakej pantulan untuk mendapatkan kaedah objek. Struktur Jenis boleh mendapatkan maklumat jenis objek, termasuk pengumpulan kaedah jenis, struktur Nilai boleh mendapatkan maklumat nilai objek, termasuk maklumat parameter yang diperlukan untuk memanggil kaedah.

Di bawah, kami menggunakan contoh untuk menunjukkan cara menggunakan pantulan untuk mendapatkan objek.

Pertama, katakan kita mempunyai jenis struktur Orang, yang mengandungi dua kaedah GetAge dan GetName:

type Person struct {
    name string
    age int
}

func (p *Person) GetAge() int {
    return p.age
}

func (p *Person) GetName() string {
    return p.name
}
Salin selepas log masuk

Seterusnya, kita mentakrifkan objek p jenis Orang dan menggunakan refleksi untuk mendapatkan kaedahnya Koleksi:

p := &Person{"Alice", 18}

t := reflect.TypeOf(p)
for i := 0; i < t.NumMethod(); i++ {
    m := t.Method(i)
    fmt.Println(m.Name)
}
Salin selepas log masuk

Dalam kod di atas, kita mula-mula menggunakan fungsi reflect.TypeOf untuk mendapatkan maklumat jenis t p, kemudian gunakan fungsi t.NumMethod untuk mendapatkan bilangan kaedah jenis p, dan kemudian gunakan t.Method berfungsi untuk mendapatkan setiap satu satu Maklumat tentang setiap kaedah, dan akhirnya mencetak nama kaedah m.Name.

Hasil output ialah:

GetAge
GetName
Salin selepas log masuk

Seperti yang anda lihat, kami berjaya memperoleh semua kaedah jenis Orang melalui refleksi.

Seterusnya, kita boleh menggunakan refleksi untuk mendapatkan maklumat nilai kaedah supaya kaedah boleh dipanggil secara dinamik. Secara khusus, kami mentakrifkan nama pembolehubah rentetan, dan secara dinamik memanggil kaedah yang sepadan mengikut nama yang dimasukkan oleh pengguna:

var name string
fmt.Println("Please enter method name:")
fmt.Scanln(&name)

v := reflect.ValueOf(p)
m := v.MethodByName(name)
if m.IsValid() {
    result := m.Call(nil)
    fmt.Println(result)
} else {
    fmt.Println("Method not found")
}
Salin selepas log masuk

Dalam kod di atas, kami mula-mula menggunakan fungsi reflect.ValueOf untuk mendapatkan maklumat nilai v , dan kemudian gunakan Fungsi v.MethodByName mendapatkan maklumat kaedah m berdasarkan nama yang dimasukkan oleh pengguna Jika kaedah itu wujud, fungsi m.Call digunakan untuk memanggil kaedah secara dinamik dan mencetak hasilnya. Nota: Fungsi Panggilan perlu melepasi senarai parameter kosong sifar.

Sekarang, kita boleh menguji kod ini Jika kita memasukkan "GetAge", 18 akan dicetak.

Setakat ini, kami telah berjaya memperoleh kaedah objek melalui refleksi dan melaksanakan fungsi memanggil kaedah secara dinamik.

Ringkasan

Melalui kajian artikel ini, kami telah mempelajari tentang kaedah pantulan untuk mendapatkan kaedah objek dalam bahasa Go. Refleksi ialah ciri yang sangat penting yang boleh membantu kami mencapai banyak fungsi lanjutan. Walaupun refleksi mempunyai kehilangan prestasi tertentu, refleksi sangat berguna dalam senario yang memerlukan penjanaan kod dinamik, penyahserikatan dan reka bentuk rangka kerja. Oleh itu, kita perlu mempelajari ilmu refleksi secara mendalam dan fleksibel mengaplikasikannya dalam pembangunan sebenar.

Atas ialah kandungan terperinci kaedah pemerolehan pantulan 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