在GoLang中动态声明类型[重复]

xxe27gdn  于 2023-04-27  发布在  Go
关注(0)|答案(1)|浏览(132)

此问题已在此处有答案

Creating structs programmatically at runtime - possible?(1个答案)
4天前关闭。
我有一个字段结构类型:

{
Name: "fieldA",
Type: "string",
}

和一个数组的字段类型:

[{
Name: "fieldA"
Type: "string"
},
{
Name: "filedB",
Type: "int",
}
...

此阵列以后可能会更改或增长。
现在我想在运行时基于这个数组定义一个新的结构类型,像这样:

type myStruct struct {
fieldA string,
fieldB int,
...
}

我认为使用反射,我可以通过调用reflect.StructOf()来获得myStruct示例,但是我可以获得类型吗?这可能吗?
谢谢

arknldoa

arknldoa1#

这里似乎有一个误解,reflect.StructOf()返回的是包含字段的struct类型,它并没有返回“a myStruct instance”,看起来这已经是你想要获取的类型了,对吧?
这个来自reflect.StructOf官方文档的演示应该很容易理解这些概念:

package main

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

func main() {
    typ := reflect.StructOf([]reflect.StructField{
        {
            Name: "Height",
            Type: reflect.TypeOf(float64(0)),
            Tag:  `json:"height"`,
        },
        {
            Name: "Age",
            Type: reflect.TypeOf(int(0)),
            Tag:  `json:"age"`,
        },
    })

    v := reflect.New(typ).Elem()
    v.Field(0).SetFloat(0.4)
    v.Field(1).SetInt(2)
    s := v.Addr().Interface()

    w := new(bytes.Buffer)
    if err := json.NewEncoder(w).Encode(s); err != nil {
        panic(err)
    }

    fmt.Printf("value: %+v\n", s)
    fmt.Printf("json:  %s", w.Bytes())

    r := bytes.NewReader([]byte(`{"height":1.5,"age":10}`))
    if err := json.NewDecoder(r).Decode(s); err != nil {
        panic(err)
    }
    fmt.Printf("value: %+v\n", s)
}

输出:

value: &{Height:0.4 Age:2}
json:  {"height":0.4,"age":2}
value: &{Height:1.5 Age:10}

相关问题