我是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"
}
答案 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}}
答案 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)
}