Golang动态创建struct的成员
我知道Go中有struct,但据我所知,您必须定义structGolang动态创建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
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是一件麻烦事
更多信息:
编辑:此时,库的工作已经完成,并且在过去的几个月内看起来很稳定:)您可以使用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!我将尝试添加以下内容:)