Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Golang?

WBOY
Lepaskan: 2024-06-02 20:24:00
asal
376 orang telah melayarinya

Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Go? Buat jenis tersuai: Gunakan kata kunci jenis untuk menentukan struktur. Dapatkan jenis pantulan: Dapatkan jenis pantulan melalui fungsi reflect.TypeOf(). Cipta jenis dinamik: Gunakan fungsi reflect.New untuk mencipta penunjuk kepada jenis tersuai. Tetapkan nilai: Gunakan fungsi v.Elem() dan reflect.Set() untuk menetapkan nilai. Dapatkan nilai: Gunakan kaedah Antaramuka() untuk mendapatkan nilai antara muka nilai tersebut.

如何使用 Golang 反射创建动态自定义类型?

Cara mencipta jenis tersuai dinamik menggunakan pantulan Go

Refleksi ialah ciri berkuasa dalam Go yang membolehkan program memeriksa dan mengubah suai kodnya sendiri. Dengan refleksi, kami boleh mencipta jenis tersuai dinamik yang boleh diubah suai pada masa jalan seperti yang diperlukan.

Buat jenis tersuai

Untuk mencipta jenis tersuai, kita boleh menggunakan type Kata kunci: type 关键字:

type person struct {
    name string
    age  int
}
Salin selepas log masuk

反射类型

要获取一个类型的反射类型,可以使用 reflect.TypeOf() 函数:

t := reflect.TypeOf(person{})
Salin selepas log masuk

创建动态类型

要创建动态类型,我们可以使用 reflect.New 函数以指定反射类型作为参数:

v := reflect.New(t)
Salin selepas log masuk

v 变量现在代表了一个指向自定义类型的指针。我们现在可以使用反射来设置和获取值:

设置值

可以使用 v.Elem() 获取指针指向的值,然后使用标准方法或 reflect.Set 函数设置值:

v.Elem().FieldByName("name").SetString("John")
v.Elem().FieldByName("age").SetInt(30)
Salin selepas log masuk

获取值

使用 reflect.Value 类型的 Interface 方法可以获取值的接口值:

name := v.Elem().FieldByName("name").Interface()
age := v.Elem().FieldByName("age").Interface()
Salin selepas log masuk

实战案例

假设我们有一个 JSON 字符串,其中包含一个人的姓名和年龄:

{
  "name": "Jane",
  "age": 35
}
Salin selepas log masuk

我们可以使用反射来动态创建 person

import (
    "encoding/json"
    "fmt"
    "reflect"
)

func main() {
    // 反射创建自定义类型
    t := reflect.TypeOf(person{})
    v := reflect.New(t)

    // 反射解组 JSON 字符串
    var data map[string]interface{}
    err := json.Unmarshal([]byte(`{
        "name": "Jane",
        "age": 35
    }`), &data)
    if err != nil {
        panic(err)
    }

    // 反射设置字段值
    for k, v := range data {
        v.Elem().FieldByName(k).Set(reflect.ValueOf(v))
    }

    // 反射获取字段值
    fmt.Println(v.Elem().FieldByName("name").Interface()) // 输出:"Jane"
    fmt.Println(v.Elem().FieldByName("age").Interface())  // 输出:35
}
type person struct {
    name string
    age  int
}
Salin selepas log masuk
🎜Jenis reflektif🎜🎜🎜Untuk mendapatkan jenis reflektif, kita boleh menggunakan reflect.TypeOf() fungsi: 🎜rrreee🎜🎜Mencipta jenis dinamik 🎜🎜🎜Untuk mencipta jenis dinamik, kita boleh menggunakan fungsi reflect.New dengan jenis pantulan yang ditentukan sebagai parameter: 🎜 rrreee🎜Pembolehubah v kini mewakili penuding kepada jenis tersuai. Kini kita boleh menggunakan refleksi untuk menetapkan dan mendapatkan nilai: 🎜🎜🎜Tetapkan nilai 🎜🎜🎜 Anda boleh menggunakan v.Elem() untuk mendapatkan nilai yang ditunjuk oleh penunjuk, kemudian gunakan kaedah standard atau reflect.Set Fungsi untuk menetapkan nilai: 🎜rrreee🎜🎜Dapatkan nilai 🎜🎜🎜Gunakan kaedah Antaramuka reflect.Value taip untuk mendapatkan nilai antara muka nilai: 🎜rrreee🎜🎜 Kes praktikal 🎜🎜🎜Andaikan kita mempunyai rentetan JSON yang mengandungi nama dan umur seseorang: 🎜rrreee🎜Kita boleh menggunakan refleksi untuk mencipta orangsecara dinamik > taip dan tetapkan nilainya: 🎜rrreee

Atas ialah kandungan terperinci Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Golang?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Label berkaitan:
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