Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Golang?

Bagaimana untuk mencipta jenis tersuai dinamik menggunakan pantulan Golang?

WBOY
WBOYasal
2024-06-02 20:24:00364semak imbas

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
}

反射类型

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

t := reflect.TypeOf(person{})

创建动态类型

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

v := reflect.New(t)

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

设置值

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

v.Elem().FieldByName("name").SetString("John")
v.Elem().FieldByName("age").SetInt(30)

获取值

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

name := v.Elem().FieldByName("name").Interface()
age := v.Elem().FieldByName("age").Interface()

实战案例

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

{
  "name": "Jane",
  "age": 35
}

我们可以使用反射来动态创建 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
}

🎜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!

Kenyataan:
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