Go map

时间:2015-11-20 01:37:34

标签: pointers dictionary go slice

我正在使用Go语言开发一个Web应用程序。 respond(writer, html, *params)函数需要一个可用于呈现HTML页面的参数列表。我想出了一张可以正常工作的地图:

&map[string][]string

但是,最近我需要以{string, map[string][]string}的格式挤入一个值对,这显然会炸毁编译器。所以我想知道我是否可以使用任何通用类型,即map[string]GenericType

欢迎任何想法。

1 个答案:

答案 0 :(得分:2)

通常,您存储[]string个键的string值。大多数时候。有时,您希望为map[string][]string密钥存储string值。

首先,从地图类型中删除指针:地图已经是小描述符,您可以传递将传递描述符副本而不是整个内容的地图,以及是否向副本添加新的键值对,你会看到原来的。按值传递地图是有效的,并且具有期望的效果/工作。

准确地说:地图类型实际上是指向地图描述符的指针,但这是一个实现细节,您不需要知道这一点来使用/使用地图。唯一重要的是你可以有效地传递地图值。

仅保留一个地图并能够存储[]stringmap[string][]string类型的值,您需要将值类型更改为interface{},但这需要您使用每次访问params地图中的元素时都会Type assertion,例如:

params := map[string]interface{}{}
params["a"] = []string{"b", "c"}

if list, ok := params["a"].([]string); ok {
    fmt.Println(list)
}

当然,您可以创建一个新的类型,其中map[string]interface{}是其基础类型,并为最常见的值类型Get()添加Set()[]string方法,而是我建议使用params的包装器struct,在多个字段中有多个映射:

type Params struct {
    P map[string][]string
    M map[string]map[string][]string
}

您的代码可以使用具有适合存储值的值类型的地图,例如:

params2 := Params{map[string][]string{}, map[string]map[string][]string{}}
params2.P["a"] = []string{"b", "c"}

params2.M["B"] = map[string][]string{
    "x": []string{"X", "Y"},
}

fmt.Println(params2.P["a"])
fmt.Println(params2.M["B"])

您还可以将Get()Set()方法添加到Params,以获取和设置最常用的Params.P地图中的元素。

Go Playground上尝试。