【发布时间】:2015-01-15 19:55:35
【问题描述】:
在go中,是否可以以某种方式动态转换变量?
例如,如果一个简单的演员是:
var intAge = interfaceAge.(int)
如果我事先不知道年龄是一个整数怎么办?一个简单的写法是
var x = getType()
var someTypeAge = interfaceAge(.x)
有没有办法实现这样的目标? reflect 包提供了一些在运行时确定或强制转换类型的方法 - 但我找不到像上面提到的任何东西(适用于所有类型的通用方案)。
【问题讨论】:
-
go 中没有“铸造”。见type switch
-
你什么时候不知道
x有什么类型? Go 是一种具有静态类型的语言。变量的类型在编译时总是已知的。不过,变量的类型可能是接口类型。 -
您正在寻找一个类型开关,它可以让您根据(静态)类型列表确定您的行为。几乎可以肯定有一种方法可以做任何你想做的事情,你能详细说明你正在尝试什么吗?
-
See the spec/documentation。当且仅当
foo是一个接口类型时,您可以执行x := foo.(int)(或更一般的foo.(T)。它是一个type assertion,如果接口没有,它会在运行时恐慌't hold the ask for type. 你可以使用x, ok := foo.(int),其中 x 将是零值,如果类型断言失败,ok将是 false。 -
OP 没有提到type assertions 的名称,但清楚地知道该功能(这就是最初的示例所显示的)。这里的问题是关于任意类型的 dynamic 选择。实际上,通过直接分配可以实现等效效果(但没有任何收获):
someTypeAge := interfaceAge。您可以随意传递interface{}类型的数据——某些函数(例如fmt.Println(interfaceAge))将动态处理数据。
标签: generics reflection casting go