从struct创建地图或对象,其他属性为关键

时间:2018-01-25 20:45:30

标签: dictionary go struct slice

我的结构如下所示构建

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存储这些数据?

1 个答案:

答案 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上的示例。