kaedah refleksi golang

WBOY
Lepaskan: 2023-05-22 17:00:59
asal
511 orang telah melayarinya

1. Konsep refleksi

Dalam pengaturcaraan, refleksi merujuk kepada kebolehan untuk mendapatkan maklumat struktur atur cara semasa runtime. Penjelasan mudah ialah program boleh menyemak status, sifat dan kaedahnya sendiri pada masa jalan tanpa perlu menentukan semua maklumat ini pada masa penyusunan. Refleksi membolehkan program bahasa Go mempunyai fleksibiliti dan keupayaan yang serupa dengan bahasa dinamik lain.

Dalam bahasa Go, untuk melaksanakan refleksi, anda boleh menggunakan pakej reflect, yang menyediakan sejumlah besar meta-maklumat tentang jenis dan nilai, yang boleh digunakan secara dinamik semasa program dijalankan.

2. Aplikasi refleksi

Refleksi mempunyai pelbagai senario aplikasi dalam bahasa Go. Contohnya:

1 Apabila menulis fungsi umum, sukar untuk meramal jenis parameter masuk tertentu, jadi anda boleh menggunakan refleksi untuk mendapatkan maklumat parameter masuk secara dinamik.

2. Apabila menulis rangka kerja ORM, anda boleh memetakan objek secara automatik ke jadual dalam pangkalan data, atau anda boleh menanyakan data daripada pangkalan data dan menggunakan refleksi untuk memetakan objek yang sepadan secara automatik.

3. Banyak rangka kerja dan alatan menggunakan refleksi untuk membaca fail konfigurasi atau menghuraikan parameter arahan.

3. Jenis pantulan

Dalam bahasa Go, terdapat dua jenis pantulan utama:

1.Type

Type is type information , yang mewakili jenis dalam Go, yang boleh menjadi jenis data asas, struktur, fungsi, penunjuk, tatasusunan, hirisan, antara muka, dsb.

2.Nilai

Nilai mewakili nilai, yang boleh menjadi sebarang jenis nilai Ia membungkus nilai data dan maklumat jenis, dan menyediakan satu siri kaedah operasi.

4. Operasi asas pantulan

1 Dapatkan maklumat jenis

Gunakan fungsi reflect.TypeOf() untuk mendapatkan maklumat jenis bagi sebarang nilai berikut:

func TypeOf(i interface{}) Type
Salin selepas log masuk

Sebagai contoh, kami ingin mendapatkan maklumat jenis rentetan "hello":

t := reflect.TypeOf("hello")
fmt.Println(t.Kind())  // 输出:string
Salin selepas log masuk

2. Dapatkan maklumat nilai

Gunakan reflect.ValueOf () berfungsi untuk mendapatkan maklumat nilai sebarang nilai , sintaksnya adalah seperti berikut:

func ValueOf(i interface{}) Value
Salin selepas log masuk

Sebagai contoh, kami ingin mendapatkan maklumat nilai pembolehubah rentetan "hello":

value := reflect.ValueOf("hello")
fmt.Println(value.String()) // 输出:hello
Salin selepas log masuk

3. Dapatkan maklumat jenis dan nilai pembolehubah

Jika anda mahu Untuk mendapatkan maklumat jenis dan nilai pembolehubah pada masa yang sama, anda boleh menggunakan kaedah reflect.TypeOf() dan reflect.ValueOf() bersama-sama, seperti berikut:

var age int = 22
t := reflect.TypeOf(age)                // 变量类型信息
v := reflect.ValueOf(age)               // 变量值信息
fmt.Println(t.Kind(), v.Int())          // 输出:int 22
Salin selepas log masuk

4 Tetapkan nilai pembolehubah melalui pantulan

gunakan Refleksi boleh mengubah suai nilai pembolehubah secara dinamik Anda perlu menggunakan kaedah jenis Nilai Set() dalam pakej reflect. Sintaks adalah seperti berikut:

func (v Value) Set(x Value)
Salin selepas log masuk

Antaranya, jenis parameter x harus konsisten dengan jenis v, jika tidak ralat akan dilaporkan.

Sebagai contoh, kami menukar nilai pembolehubah umur kepada 33:

v := reflect.ValueOf(&age)
v.Elem().SetInt(33)
fmt.Println(age)                     // 输出:33
Salin selepas log masuk

5 Ubah suai nilai ahli struktur melalui refleksi

Gunakan refleksi untuk mengubah suai secara dinamik. ahli struktur Untuk nilai, anda perlu menggunakan jenis Nilai dalam pakej mencerminkan dan kaedah FieldByName() dalam jenis Jenis Sintaks adalah seperti berikut:

func (v Value) FieldByName(name string) Value
Salin selepas log masuk

Sebagai contoh, kami mentakrifkan struktur Orang dan mengubah suai. nilai nama dan umur ahlinya:

type Person struct {
    name string
    age  int
}

func main() {
    p := Person{name: "Mike", age: 22}
    v := reflect.ValueOf(&p).Elem()
    v.FieldByName("name").SetString("Tom")
    v.FieldByName("age").SetInt(33)
    fmt.Println(p)                         // 输出:{Tom 33}
}
Salin selepas log masuk

6 Memanggil fungsi melalui refleksi

Menggunakan refleksi untuk memanggil fungsi secara dinamik, anda perlu menggunakan jenis Nilai dalam pakej mencerminkan dan kaedah Panggilan() dalam jenis Jenis Sintaks adalah seperti berikut:

func (v Value) Call(args []Value) []Value
Salin selepas log masuk

Antaranya, parameter args ialah parameter input fungsi, dan nilai pulangan ialah parameter output fungsi.

Sebagai contoh, kami mentakrifkan fungsi Tambah dan memanggil fungsi Tambah melalui pantulan:

func Add(a int, b int) int {
    return a + b
}

func main() {
    var params []reflect.Value
    params = append(params, reflect.ValueOf(1))
    params = append(params, reflect.ValueOf(2))
    result := reflect.ValueOf(Add).Call(params)
    fmt.Println(result[0].Int())           // 输出:3
}
Salin selepas log masuk

Di atas adalah operasi asas pantulan dalam bahasa Go yang memberikan keupayaan yang lebih berkuasa kepada bahasa Go dan Fleksibiliti, kita juga boleh menggunakan refleksi secara fleksibel untuk melaksanakan beberapa fungsi semasa pembangunan.

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