Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers Go映射的通用值类型_Pointers_Dictionary_Go_Slice - Fatal编程技术网

Pointers Go映射的通用值类型

Pointers Go映射的通用值类型,pointers,dictionary,go,slice,Pointers,Dictionary,Go,Slice,我正在使用Go语言开发一个web应用程序。respond(writer,html,*params)函数需要一个可用于呈现html页面的参数列表。我想出了一张这样的地图,效果很好: &map[string][]string 然而,最近我需要以{string,map[string][]string}的格式压缩一个值对,这显然让编译器崩溃了。因此,我想知道是否有任何泛型类型可以使用,即map[string]GenericType 欢迎任何想法。因此通常您会为字符串键存储[]字符串值。大多数时

我正在使用Go语言开发一个web应用程序。
respond(writer,html,*params)
函数需要一个可用于呈现html页面的参数列表。我想出了一张这样的地图,效果很好:

&map[string][]string
然而,最近我需要以
{string,map[string][]string}
的格式压缩一个值对,这显然让编译器崩溃了。因此,我想知道是否有任何泛型类型可以使用,即
map[string]GenericType


欢迎任何想法。

因此通常您会为
字符串
键存储
[]字符串
值。大多数时候。偶尔您会想为
string
键存储一个
map[string][]string

首先,从映射类型中删除指针:映射已经是很小的描述符,您可以传递映射,该映射将传递描述符的一个副本而不是整个内容,如果您向副本添加一个新的键值对,您将在原始中看到这一点。通过值传递贴图是有效的,并且具有所需的效果/效果

确切地说:映射类型实际上是指向引擎盖下的映射描述符的指针,但这是一个实现细节,使用/使用映射时不需要知道这一点。唯一重要的是,您可以高效地传递映射值

只保留一个映射,并且能够存储类型为
[]string
map[string][]string
的值,需要将值类型更改为
interface{}
,但这需要您在每次访问params映射中的元素时都使用,例如:

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

if list, ok := params["a"].([]string); ok {
    fmt.Println(list)
}
当然,您可以创建一个以
map[string]interface{}
为基础类型的新类型,并为最常见的值类型
[]string
添加
Get()
Set()
方法,但我建议为参数使用包装器
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
映射中获取和设置元素


在.

上尝试一下,也许如果您表达了所需的结果以及
response
的确切功能,我们会比推荐像
map[string][]interface{}
这样不友好的东西更好,因为它可能太通用了。由于您的问题目前的措辞,很难知道该推荐什么,因为不可能知道您的
response
目标是什么。你提供的关于你想做什么的细节太少了,任何人都无法提供一个好的推荐。
响应
做什么?什么是
*params
,它是如何影响事情的?