通过字符串名称对特定结构类型进行类型转换

时间:2017-10-30 12:08:40

标签: go struct type-assertion

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

例如:

type Testing interface{}

和新变量

stringName := "Testing"
newTestingVariable.(stringName)

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

干杯

1 个答案:

答案 0 :(得分:5)

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

type assertion中:

x.(T)
     

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

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

当你这样做时:

stringName := "Testing"
newTestingVariable.(stringName)

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

所以在编译时编译器只能使用interface{}作为类型表达式的结果类型,但那么重点是什么?

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