另一个Golang Map结构

时间:2014-05-27 21:28:25

标签: go

我是golang的新手,在这种情况下我有一个map [string],它有一个struct。 在这一点上,一切都有效。

但我希望有一个map [string],我可以同时访问另一个map [string],它有自己的结构。

这是我正在尝试工作的代码。

type myStruct struct{
    atrib1       string
    atrib2       string 

}

var apiRequest map[string] map[string]myStruct

我想访问类似的内容:

func main() {
    apiRequest = make(map[string] map[string]myStruct)

    apiKeyTypeRequest["Key"]["MyFirstOption"].atrib1 = "first Value first op" 
    apiKeyTypeRequest["Key"]["MyFirstOption"].atrib2 = "second Value first op" 
    apiKeyTypeRequest["Key"]["MysecondtOption"].atrib1 = "first Value second op" 

}

3 个答案:

答案 0 :(得分:6)

在地图中使用地图的另一种方法是使用map[mapKey] mapKey,其中type mapKey struct { Key string Option string } 是结构:

myStruct

这样做的好处是,您只需在搜索map[string]myStruct时进行一次查找,而只需创建一张地图。
缺点是你需要能够获得选项package main import "fmt" type myStruct struct { atrib1 string atrib2 string } type mapKey struct { Key string Option string } func main() { apiKeyTypeRequest := make(map[mapKey]myStruct) apiKeyTypeRequest[mapKey{"Key", "MyFirstOption"}] = myStruct{"first Value first op", "second Value first op"} apiKeyTypeRequest[mapKey{"Key", "MysecondtOption"}] = myStruct{atrib1: "first Value second op"} fmt.Printf("%+v\n", apiKeyTypeRequest) } 地图,因为它不存在。此外,您无法检查某个密钥是否存在,因为密钥和选项成对存在。

工作示例:

{{1}}

游乐场: http://play.golang.org/p/tGd7ja7QI2

答案 1 :(得分:6)

为了扩展先前的答案,必须声明和实例化每个地图(以及地图末尾的结构),这意味着你需要实例化"外部"图

mapOfMaps := make(map[string]map[string]myStruct)

以及"内部"你拥有的每把钥匙的地图。

mapOfMaps[key] = make(map[string]myStruct)

您遇到的一个明显问题是如何动态检查mapOfMaps[key]是否已经实例化?您可以使用以下语法执行此操作:

if _, ok := mapOfMaps[key]; !ok {
    mapOfMaps[key] = make(map[string]myStruct)
}

此语法检查mapOfMaps是否已具有该键的实例化值,如果未实例化它。类似地,您可以使用相同的语法通过检查mapOfMaps[key][key2]是否已实例化来实例化您正在使用的结构。

if _, ok := mapOfMaps[key][key2]; !ok {
    mapOfMaps[key][key2] = new(myStruct)
}

现在,您可以通过调用2个键和struct

的属性来访问该结构
fmt.Println(mapOfMaps[key][key2].atrib1)

答案 2 :(得分:2)

正如@FUZxxl所说,你需要为每个外部地图初始化子地图,但它有一个简写语法:

type myStruct struct {
    atrib1 string
    atrib2 string
}

func main() {
    var myMap = map[string]map[string]myStruct{
        "foo": {
            "bar": {attrib1: "a", attrib2: "b"},
            "baz": {"c", "d"}, //or by order...
        },
        "bar": {
            "gaz": {"e", "f"},
            "faz": {"g", "h"},
        },
    }

    fmt.Println(myMap["foo"]["bar"].atrib1)
    fmt.Println(myMap["bar"]["gaz"].atrib2)
}