2015-01-15 44 views
10

In go,是否有可能以某种方式动态地转换变量?Golang:动态地将一个接口转换为一个类型变量

例如,如果一个简单的铸件是:

var intAge = interfaceAge.(int) 

,如果我不知道那是什么年龄提前一个int?一个简单的方式写它将是

var x = getType() 
var someTypeAge = interfaceAge(.x) 

有没有办法实现这样的事情?反射包给出了一些在运行时确定或者转换类型的方法 - 但是我找不到像上面提到的那样的东西(一种适用于所有类型的通用方案)。

+1

有没有在去没有“铸造”。请参见[type switch](http://golang.org/doc/effective_go.html#type_switch) – JimB

+2

什么时候你不知道“x”是什么类型? Go是一种静态类型的语言。编译时总是知道变量的类型。尽管一个变量的类型可能是一个接口类型。 – fuz

+1

您正在寻找一种类型开关,可以根据(静态)类型列表来确定您的行为。几乎肯定有一种方法可以处理你所希望的任何事情,你能详细说明你正在尝试的是什么吗? – Crisfole

回答

3

不,你不能。 Go是一种静态类型语言。变量的类型是在编译时确定的。

如果要动态地确定interface{}type你可以使用type switching

var t interface{} 
t = functionOfSomeType() 
switch t := t.(type) { 
default: 
    fmt.Printf("unexpected type %T", t)  // %T prints whatever type t has 
case bool: 
    fmt.Printf("boolean %t\n", t)    // t has type bool 
case int: 
    fmt.Printf("integer %d\n", t)    // t has type int 
case *bool: 
    fmt.Printf("pointer to boolean %t\n", *t) // t has type *bool 
case *int: 
    fmt.Printf("pointer to integer %d\n", *t) // t has type *int 
} 
+0

谢谢。我没有得到的是为什么Go是静态类型的这一事实意味着您不能在运行时转换类型,例如在C#中,您可以那么,C#也是一种静态类型的语言,请您详细说明一下吗? – orcaman

+0

@orcaman:我认为您可能会将泛型与接口混淆在一起,它的类型*在运行时总是*已知的,因为它是在转换时已知[转换](http://golang.org/ref/spec#Conversions)也适用于Go。 – JimB

+0

@orcaman在C#中,您的类型将使用'var'来推断..就像它一样是在 走。如果要明确定义类型,则还必须明确地将其转换为所需的类型(除非您正在装箱)。所以,我不确定我是否与C#进行比较 - 它的情况也是如此。现在,如果你正在谈论“动态” - 那么这是一个完全不同的野兽,并且不能保证编译时类型的安全性。 –

相关问题