Dictionary 映射值可以是变量类型吗?

Dictionary 映射值可以是变量类型吗?,dictionary,go,Dictionary,Go,在Golang中,map中的值可以是类型吗?例如,如何创建一个映射m[string]类型,使其可以如下所示 m["abc"] = int m["def"] = string m["ghi"] = structtype ( some structure of type structtype) 我需要这样的映射,因为我有一个函数,它有一个字符串参数,根据这个字符串参数,函数创建一个特定类型的变量并执行一些操作。因此,如果我有一个将字符串映射到类型的映射,那么函数可以使用字符串参数作为键来检查

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

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

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

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

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

val["int"] = reflect.TypeOf(int(0))
pointer_to_new_item := reflect.New(val["int"])
如果需要非指针值,则使用
间接

new_item := reflect.Indirect(pointer_to_new_item)
使用reflect创建一个值将为您提供一个
reflect.value
,然后您需要从使用其他reflect函数中解压缩所需的实际值。有关更多信息,请参阅


请记住,
reflect。New
只生成简单的类型、结构等。如果您需要通道、贴图或切片,则还有其他类似的函数,它们的工作方式类似于
make
builtin。

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

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

val["int"] = reflect.TypeOf(int(0))
pointer_to_new_item := reflect.New(val["int"])
如果需要非指针值,则使用
间接

new_item := reflect.Indirect(pointer_to_new_item)
使用reflect创建一个值将为您提供一个
reflect.value
,然后您需要从使用其他reflect函数中解压缩所需的实际值。有关更多信息,请参阅



请记住,
reflect。New
只生成简单的类型、结构等。如果您需要通道、贴图或切片,还有其他类似的函数,它们的工作方式类似于
make
builtin。

类型不是值,但您可以使用类型的零值,或者
reflect.Type
values。您需要非常熟悉
reflect
package.RayfenWindspear和@JimB,因此映射应该定义为m[string]interface{}@user1851006
map[string]reflect.Type
我发誓我以前已经回答过这个问题,但我似乎找不到它……类型的可能副本不是值,但您可以使用类型的零值,或
reflect.type
值。您需要非常熟悉
reflect
package.RayfenWindspear和@JimB,因此映射应该定义为m[string]interface{}?@user1851006
map[string]reflect.Type
我发誓我以前已经回答过这个问题,但我似乎找不到它……在您的示例中,可能是的重复项,而不是int,如果它是结构类型,我是否必须创建该类型的随机结构变量以反映其值?是的,但您只需要在填充映射时执行,因此只需执行一次。您还必须注意,此答案中的代码将为您提供一个
reflect.Value
,而不是
int
。有额外的
reflect
内容,使其成为实际的
int
struct
或其他任何内容。这是非常正确的,这也是我确保链接到文档的原因之一。我应该在答案中写上这一点。我会编辑它。@MiloChristiansen这就是我之所以标记为重复的原因,而我回答的是完全相同的问题。您的答案很好,也很简洁,但我想确保链接到其他资源。在您的示例中,如果它是一个结构类型,我是否必须创建该类型的随机结构变量以反映其值,而不是int?是的,但您只需在填充映射时执行此操作,因此只需执行一次。您还必须注意,此答案中的代码将为您提供一个
reflect.Value
,而不是
int
。有额外的
reflect
内容,使其成为实际的
int
struct
或其他任何内容。这是非常正确的,这也是我确保链接到文档的原因之一。我应该在答案中写上这一点。我会编辑它。@MiloChristiansen这就是我之所以标记为重复的原因,而我回答的是完全相同的问题。您的答案很好,非常简洁,但我想确保链接到其他资源。