为了账号安全,请及时绑定邮箱和手机立即绑定

Go map 的泛型值类型

Go map 的泛型值类型

Go
慕哥9229398 2021-11-22 18:20:50
我正在使用 Go 语言开发 Web 应用程序。该respond(writer, html, *params)函数需要一个可用于呈现 HTML 页面的参数列表。我想出了一张地图,因为它可以正常工作:&map[string][]string但是,最近我需要挤入一个值对,其格式{string, map[string][]string}显然会炸毁编译器。所以我想知道是否有任何我可以使用的泛型类型,即map[string]GenericType.欢迎任何想法。
查看完整描述

1 回答

?
扬帆大鱼

TA贡献1799条经验 获得超9个赞

所以通常你存储键的[]string值string。大多数时候。有时您想map[string][]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{}作为其基础类型,并为最常见的值类型添加Get()和Set()方法[]string,但我建议struct为 params使用一个包装器,在多个字段中使用多个映射:


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 元素添加Get()和Set()方法。ParamsParams.P


查看完整回答
反对 回复 2021-11-22
  • 1 回答
  • 0 关注
  • 123 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信