通过字符串名称类型转换为特定的结构类型

Posted

技术标签:

【中文标题】通过字符串名称类型转换为特定的结构类型【英文标题】:Typecast to a specific struct type by its string name 【发布时间】:2018-04-11 09:52:27 【问题描述】:

我想通过使用结构/接口的字符串名称值将特定变量类型转换为特定定义的结构/接口。

例如:

type Testing interface

和新变量

stringName := "Testing"
newTestingVariable.(stringName)

这可能是偶然的吗?也许使用反射?

干杯

【问题讨论】:

不完全是这样,但有一个使用反射创建新类型名称的功能请求。 github.com/golang/go/issues/16522 。还有插件包。 golang.org/pkg/plugin 【参考方案1】:

这是不可能的。 Go 是一种静态类型语言,这意味着在编译时必须知道变量和表达式的类型。

在type assertion:

x.(T)

[...] 如果类型断言成立,则表达式的值为存储在x 中的值,其类型为T

因此您使用类型断言来获取(或测试)您指定的类型的值。

什么时候做:

stringName := "Testing"
newTestingVariable.(stringName)

类型断言结果的类型是什么?你没说。您指定了一个包含类型名称的string 值,但这只能在运行时 确定。 (是的,在上面的示例中,编译器可以跟踪作为常量值给出的值,但在一般情况下,这在编译时是不可能的。)

所以在编译时编译器只能使用interface作为类型表达式结果的类型,但那又有什么意义呢?

如果要动态测试x的类型是否为T(或者如果接口值x实现T),您可以为此使用反射(包reflect) .在这种情况下,您将使用 reflect.Type 来指定要测试的类型,而不是使用 string 来表示其名称。

【讨论】:

啊好吧..我的停职就是这样。谢谢你这么好的解释。

以上是关于通过字符串名称类型转换为特定的结构类型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用自定义键值名称将映射列转换为结构类型?

Unmarshal中的动态类型

将 ArrayList 转换为特定类型的数组 [重复]

将 JSON 对象转换为特定类型

如何将向量转换为特定类型的字符串

无法将类型“()”的值转换为预期的参数类型“字符串”