我的结构如下所示构建
type RTB struct {
ID string
Modules []*Modules
Req []*Req
}
现在在模块I中有以下
type Modules struct {
Name string
Type string
Path string
Id string
}
现在我已经在内存中找到了RTB的对象,我想创建map
(我可以在它上面循环si对象,如下所示:
NewObject {
Type string//the value from the module struct
Modules []*Modules // From the rtb struct
}
当然我可以循环它(如果没有更优雅的方式......)并创建新结构(如新对象)并从两个结构中填充数据,但是在Golang中有更好的方法,如map to存储这些数据?
答案 0 :(得分:1)
您必须使用循环来遍历模块并从中构建映射。没有更简单的方法如果您需要在多个位置使用此功能,请将其放入实用程序功能并在需要的地方调用它。
构建地图的示例:
rtb := &RTB{
Modules: []*Modules{
{Name: "n1", Type: "t1"},
{Name: "n2", Type: "t1"},
{Name: "n3", Type: "t2"},
},
}
m := map[string][]*Modules{}
for _, mod := range rtb.Modules {
m[mod.Type] = append(m[mod.Type], mod)
}
// Verify result (JSON for "nice" outpout):
fmt.Println(json.NewEncoder(os.Stdout).Encode(m))
输出:
{"t1":[{"Name":"n1","Type":"t1"},{"Name":"n2","Type":"t1"}],"t2":[{"Name":"n3","Type":"t2"}]}
<nil>
如果你想要一片NewObject
代替地图,你可以像这样构建:
// m is the map built above.
var newObjs []*NewObject
for k, v := range m {
newObjs = append(newObjs, &NewObject{
Type: k,
Modules: v,
})
}
fmt.Println(json.NewEncoder(os.Stdout).Encode(newObjs))
输出:
[{"Type":"t1","Modules":[{"Name":"n1","Type":"t1"},{"Name":"n2","Type":"t1"}]},{"Type":"t2","Modules":[{"Name":"n3","Type":"t2"}]}]
<nil>
尝试Go Playground上的示例。