Golang ialah bahasa yang ditaip secara statik dengan ciri berorientasikan objek. Refleksi ialah keupayaan untuk mendapatkan jenis nilai dan beroperasi padanya pada masa jalan. Golang mempunyai mekanisme pantulan terbina dalam, yang boleh mengubah suai nilai atribut objek melalui pantulan. Artikel ini akan memperkenalkan mata pengetahuan yang berkaitan tentang tetapan refleksi Golang.
Pertama sekali, anda perlu memahami jenis refleksi yang biasa digunakan di Golang. Di Golang, jenis pantulan (reflect.Type) ialah jenis antara muka. Ia mentakrifkan maklumat jenis objek, termasuk nama jenis, saiz jenis, penjajaran, set kaedah, dsb.
Di Golang, kita boleh mendapatkan maklumat jenis objek melalui pantulan. Sebagai contoh, kod berikut boleh mendapatkan maklumat jenis pembolehubah a:
package main import ( "fmt" "reflect" ) func main() { var a = 10 t := reflect.TypeOf(a) fmt.Println("TypeOf a:", t) }
Hasil output adalah seperti berikut:
TypeOf a: int
Seperti yang anda lihat, kami memperoleh maklumat jenis pembolehubah a melalui fungsi reflect.TypeOf
Jenis, hasil yang diperoleh adalah daripada jenis int
.
Selain jenis asas, anda juga boleh mendapatkan struktur, fungsi, penunjuk dan jenis maklumat lain melalui refleksi. Sebagai contoh, kod berikut boleh mendapatkan maklumat jenis struktur:
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func main() { var p = Person{"John", 30} t := reflect.TypeOf(p) fmt.Println("TypeOf p:", t) }
Hasil output adalah seperti berikut:
TypeOf p: main.Person
Seperti yang anda lihat, kami memperoleh struktur melalui fungsi reflect.TypeOf
Person
taip maklumat.
Selain jenis pantulan, Golang juga mempunyai konsep nilai pantulan (reflect.Value). Nilai yang dicerminkan ialah jenis antara muka yang mengandungi maklumat nilai dan jenis objek. Di Golang, kita boleh mendapatkan nilai dan jenis maklumat sesuatu objek melalui refleksi. Sebagai contoh, kod berikut boleh mendapatkan maklumat nilai dan jenis pembolehubah a:
package main import ( "fmt" "reflect" ) func main() { var a = 10 v := reflect.ValueOf(a) fmt.Println("ValueOf a:", v) fmt.Println("TypeOf a:", v.Type()) }
Hasil output adalah seperti berikut:
ValueOf a: 10 TypeOf a: int
Seperti yang anda lihat, kami memperoleh pembolehubah melalui fungsi reflect.ValueOf
Nilai dan jenis maklumat a.
Begitu juga, sebagai tambahan kepada jenis asas, anda juga boleh mendapatkan nilai dan menaip maklumat struktur, fungsi, penunjuk dan jenis lain melalui refleksi. Sebagai contoh, kod berikut boleh mendapatkan maklumat nilai dan jenis struktur:
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func main() { var p = Person{"John", 30} v := reflect.ValueOf(p) fmt.Println("ValueOf p:", v) fmt.Println("TypeOf p:", v.Type()) }
Hasil output adalah seperti berikut:
ValueOf p: {John 30} TypeOf p: main.Person
Seperti yang anda lihat, kami memperoleh struktur melalui fungsi reflect.ValueOf
Nilai dan jenis maklumat badanPerson
.
Selepas kita memperoleh jenis dan nilai objek, kita boleh menggunakan pantulan untuk mengubah suai nilai atribut objek. Secara umumnya, kita boleh mendapatkan nilai yang ditunjukkan oleh penunjuk melalui kaedah refleksi Elem()
. Sebagai contoh, kod berikut boleh mengubah suai nilai atribut struktur:
package main import ( "fmt" "reflect" ) type Person struct { Name string Age int } func main() { var p = &Person{"John", 30} v := reflect.ValueOf(p).Elem() nameValue := v.FieldByName("Name") nameValue.SetString("Tom") fmt.Println(p) }
Hasil output adalah seperti berikut:
&{Tom 30}
Seperti yang anda lihat, kami memperoleh struktur melalui kaedah refleksi FieldByName
Nilai atribut badan, dan nilai atribut SetString
telah diubah suai menggunakan kaedah Name
.
Selain mengubah suai nilai atribut struktur, anda juga boleh mengubah suai nilai parameter fungsi melalui pantulan. Sebagai contoh, kod berikut boleh mengubah suai nilai parameter fungsi:
package main import ( "fmt" "reflect" ) func Add(a, b int) int { return a + b } func main() { f := reflect.ValueOf(Add) args := []reflect.Value{reflect.ValueOf(10), reflect.ValueOf(20)} f.Call(args) fmt.Println("Before:", args) args[0] = reflect.ValueOf(100) args[1] = reflect.ValueOf(200) f.Call(args) fmt.Println("After:", args) }
Hasil output adalah seperti berikut:
Before: [10 20] After: [100 200]
Seperti yang anda lihat, kami memanggil fungsi melalui kaedah refleksi Call
Add
Dan mengubah suai parameter fungsi.
Apabila menggunakan tetapan pantulan Golang, anda perlu memberi perhatian kepada perkara berikut:
Atas ialah kandungan terperinci Penjelasan terperinci tentang titik pengetahuan berkaitan tetapan refleksi Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!