Golang动态创建struct的成员

Golang动态创建struct的成员,go,go-server,Go,Go Server,我知道Go中有struct,但据我所知,您必须定义struct type Circle struct{ x,y,r float64 } 我想知道如何声明结构中不存在的新变量 circle := new(Circle) circle.color = "black" 你不能。Go是静态类型的,不允许这样的构造 结构在内存中有一个与定义直接相关的布局,并且没有存储这些额外字段的位置 你可以用地图代替。此外,您还可以将&circle用作键或键的一部分,将贴图元素与任意结构关联起来 type

我知道Go中有struct,但据我所知,您必须定义struct

type Circle struct{
    x,y,r float64
}
我想知道如何声明结构中不存在的新变量

circle := new(Circle)
circle.color = "black"

你不能。Go是静态类型的,不允许这样的构造

结构在内存中有一个与定义直接相关的布局,并且没有存储这些额外字段的位置

你可以用地图代替。此外,您还可以将
&circle
用作键或键的一部分,将贴图元素与任意结构关联起来

type key struct {
    target interface{}
    field string
}

x := make(map[key]string)
x[key{ target: circle, field: "color" }] = "black"

您需要使用映射(类型为
map[string]interface{}
)来处理动态JSON。以下是创建新地图的示例:

// Initial declaration
m := map[string]interface{}{
    "key": "value",
}

// Dynamically add a sub-map
m["sub"] = map[string]interface{}{
    "deepKey": "deepValue",
}
将JSON解组到映射中的方式如下所示:

var f interface{}
err := json.Unmarshal(b, &f)
上面的代码将在
f
中为您留下一个结构类似于:

f = map[string]interface{}{
    "Name": "Wednesday",
    "Age":  6,
    "Parents": []interface{}{
        "Gomez",
        "Morticia",
    },
}
您需要使用类型断言来访问它,否则Go将不知道它是一个映射:

m := f.(map[string]interface{})
您还需要对从映射中提取的每个项目使用断言或类型开关。处理非结构化JSON是一件麻烦事

更多信息:


我已经开始研究这个小型存储库

此时,通过传递struct实例并修改字段(添加、删除、更改类型和标记),可以在运行时扩展现有struct

仍在进行中,所以不要期望有重大的变化:)


编辑:此时,库的工作已经完成,并且在过去的几个月内看起来很稳定:)

您可以使用reflect软件包进行编辑,检查
StructOf
方法它允许您从
[]reflect.StructField
创建一个新的结构。例如:

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)

}

也许我需要重新表述我的问题。假设我想要构造一个json主体。我不知道json的内部结构是什么。我怎样才能创建这样的地图呢?浏览一下,它会告诉你关于地图和许多其他你需要的东西。然后,正如其他人所说,
map[string]interface{}
是具有未知键和值类型的JSON对象的类型(而
[]interface{}
是具有未知元素类型的JSON数组)。在最初的问题中,我根本看不到在哪里提到JSON。你能调整答案或编辑问题吗?你真是个天才!这个图书馆非常有用。不过,有一点是遗漏的。未报告的字段只有在具有PkgPath时才能添加。我的建议是:如果扩展字段,请使用
模型中的字段(
reflect.TypeOf(model.Elem().PkgPath()
),对于新结构,请请求PkgPath,或者尝试通过堆栈查找它。如果你愿意,这里是我在quick上所做的:Thx!我将尝试添加以下内容:)