Penjelasan terperinci tentang titik pengetahuan berkaitan tetapan refleksi Golang

PHPz
Lepaskan: 2023-04-03 13:37:17
asal
529 orang telah melayarinya

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.

1. Jenis Refleksi

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)
}
Salin selepas log masuk

Hasil output adalah seperti berikut:

TypeOf a: int
Salin selepas log masuk

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)
}
Salin selepas log masuk

Hasil output adalah seperti berikut:

TypeOf p: main.Person
Salin selepas log masuk

Seperti yang anda lihat, kami memperoleh struktur melalui fungsi reflect.TypeOfPerson taip maklumat.

2. Nilai pantulan

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())
}
Salin selepas log masuk

Hasil output adalah seperti berikut:

ValueOf a: 10
TypeOf a: int
Salin selepas log masuk

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())
}
Salin selepas log masuk

Hasil output adalah seperti berikut:

ValueOf p: {John 30}
TypeOf p: main.Person
Salin selepas log masuk

Seperti yang anda lihat, kami memperoleh struktur melalui fungsi reflect.ValueOf Nilai dan jenis maklumat badanPerson.

3. Tetapan pantulan

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)
}
Salin selepas log masuk

Hasil output adalah seperti berikut:

&{Tom 30}
Salin selepas log masuk

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)
}
Salin selepas log masuk

Hasil output adalah seperti berikut:

Before: [10 20]
After: [100 200]
Salin selepas log masuk

Seperti yang anda lihat, kami memanggil fungsi melalui kaedah refleksi Call AddDan mengubah suai parameter fungsi.

4. Nota

Apabila menggunakan tetapan pantulan Golang, anda perlu memberi perhatian kepada perkara berikut:

  • Tetapan pantulan hanya boleh mengubah suai medan yang dieksport di tahap pakej. medan yang tidak dieksport tidak boleh diubah suai;
  • Tetapan pantulan boleh menyebabkan ralat jenis masa kompilasi atau panik masa jalan, jadi ia perlu digunakan dengan berhati-hati; dan boleh menjejaskan kecekapan operasi.
  • 5. Ringkasan

Tetapan pantulan Golang ialah ciri berkuasa yang boleh memperoleh jenis objek dan keupayaan untuk beroperasi pada masa jalan. Dalam artikel ini, kami memperkenalkan mata pengetahuan yang berkaitan tentang jenis pantulan, nilai pantulan dan tetapan pantulan di Golang. Melalui kajian artikel ini, saya percaya bahawa pembaca mempunyai pemahaman yang lebih mendalam tentang tetapan refleksi Golang.

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!

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