【问题标题】:Generic value type of Go map [duplicate]Go map 的泛型值类型
【发布时间】:2016-02-22 09:39:34
【问题描述】:

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

&map[string][]string

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

欢迎任何想法。

【问题讨论】:

  • 也许如果你表达了想要的结果以及 respond 的确切作用,我们可以提供更好的帮助而不是推荐像 map[string][]interface{} 这样不友好的东西,这可能太笼统了。由于您的问题目前措辞,很难知道要推荐什么,因为不可能知道respond 的目标是什么。您提供的有关您想做的事情的细节太少,无法为任何人提供好的建议。 respond 是做什么的?什么是*params,它对事物有何影响?

标签: pointers dictionary go slice


【解决方案1】:

所以通常你为string 键存储[]string 值。大多数时候。有时您想为string 键存储map[string][]string 值。

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

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

只保留一个映射并能够存储[]stringmap[string][]string 类型的值将需要您将值类型更改为interface{},但这需要您每次使用Type assertion访问 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 映射中获取和设置元素。

Go Playground 上试试。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 2017-07-14
    • 1970-01-01
    • 2018-01-13
    • 2021-12-06
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    相关资源
    最近更新 更多