【问题标题】:Can map values be variable types?映射值可以是变量类型吗?
【发布时间】:2017-07-28 05:45:06
【问题描述】:

在 Golang 中,map 中的值可以是类型吗?例如,我如何创建一个映射 m[string]type 使其可以是这样的,

 m["abc"] = int
 m["def"] = string
 m["ghi"] = structtype ( some structure of type structtype)

我需要这样的映射,因为我有一个函数,它有一个字符串参数,并且根据该字符串参数,该函数创建一个特定类型的变量并执行一些操作。因此,如果我有一个将字符串映射到类型的映射,该函数可以使用字符串参数作为键检查该映射,以找出它需要创建的变量类型。

【问题讨论】:

标签: dictionary go


【解决方案1】:

听起来你需要map[string]reflect.Type

val := map[string]reflect.Type{}{}

val["int"] = reflect.TypeOf(int(0))
pointer_to_new_item := reflect.New(val["int"])

如果您需要非指针值,请使用Indirect

new_item := reflect.Indirect(pointer_to_new_item)

使用反射创建一个值会给你一个reflect.Value,然后你需要从使用其他反射函数中解压缩你想要的实际值。请参阅The reflect documentation 了解更多信息。

请记住,reflect.New 只生成简单的类型、结构等。如果您需要通道、映射或切片,还有其他类似的函数,类似于 make 内置函数。

【讨论】:

  • 在你的例子中,如果它是一个结构类型,而不是 int,我是否必须创建一个该类型的随机结构变量来反映它的值?
  • 是的,但您只需要在填充地图时执行此操作,因此只需执行一次。
  • 您还必须注意,此答案中的代码将为您提供reflect.Value,而不是int。有额外的 reflect 内容使其成为实际的 intstruct 或其他任何东西。
  • 非常正确,这是我确保链接到文档的原因之一。我可能应该把它放在答案中。我会编辑它。
  • @MiloChristiansen 这就是我标记为与我回答的问题重复的原因,这是完全相同的问题。你的回答很好而且很简洁,但我想确保链接到其他资源。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-02
  • 1970-01-01
  • 2023-03-22
  • 2010-12-20
  • 1970-01-01
  • 2019-10-17
相关资源
最近更新 更多