另一个Golang Map结构

Mau*_*ori 2 go

我是Golang的新工作,在这种情况下我有一个map [string],它有一个struct.在这一点上,一切都是有效的.

但是我希望有一个map [string],我可以在其中同时访问另一个具有self结构的map [string].

这是我正在努力工作的代码.

type myStruct struct{
    atrib1       string
    atrib2       string 

}

var apiRequest map[string] map[string]myStruct
Run Code Online (Sandbox Code Playgroud)

我想访问这样的东西:

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" 

}
Run Code Online (Sandbox Code Playgroud)

ANi*_*sus 8

在地图中使用地图的另一种方法是使用单个map[mapKey]where mapKey作为结构:

type mapKey struct {
    Key    string
    Option string
}
Run Code Online (Sandbox Code Playgroud)

好处是您在搜索a时只需执行一次查找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)
}
Run Code Online (Sandbox Code Playgroud)

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


Ver*_*ran 6

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

mapOfMaps := make(map[string]map[string]myStruct)
Run Code Online (Sandbox Code Playgroud)

以及每个键的"内部"地图.

mapOfMaps[key] = make(map[string]myStruct)
Run Code Online (Sandbox Code Playgroud)

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

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

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

if _, ok := mapOfMaps[key][key2]; !ok {
    mapOfMaps[key][key2] = new(myStruct)
}
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过调用2个键和结构的属性来访问结构

fmt.Println(mapOfMaps[key][key2].atrib1)
Run Code Online (Sandbox Code Playgroud)