Generics Golang:动态地将接口转换为类型化变量

Generics Golang:动态地将接口转换为类型化变量,generics,reflection,casting,go,Generics,Reflection,Casting,Go,在go中,是否可以以某种方式动态地强制转换变量 例如,如果简单强制转换为: var intAge = interfaceAge.(int) 如果我事先不知道年龄是整数怎么办?一个简单的写作方法是 var x = getType() var someTypeAge = interfaceAge(.x) 有没有办法实现这样的目标?reflect包提供了一些在运行时确定或强制转换类型的方法——但我找不到与上述类似的方法(一种适用于所有类型的通用方案) 不,你不能。Go是一种静态类型的语言。变量的

在go中,是否可以以某种方式动态地强制转换变量

例如,如果简单强制转换为:

var intAge  = interfaceAge.(int)
如果我事先不知道年龄是整数怎么办?一个简单的写作方法是

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

有没有办法实现这样的目标?reflect包提供了一些在运行时确定或强制转换类型的方法——但我找不到与上述类似的方法(一种适用于所有类型的通用方案)

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

如果要动态确定
接口{}
类型
,可以使用:


围棋中没有“铸造”。查看您何时不知道
x
的类型?Go是一种静态类型的语言。变量的类型在编译时总是已知的。变量的类型可能是接口类型。您正在寻找一个类型开关,该开关允许您根据(静态)类型列表确定行为。几乎可以肯定的是,有一种方法可以做任何你想做的事情,你能详细说明一下你在做什么吗?。如果且仅当,
foo
是一种接口类型,您可以执行
x:=foo.(int)
(或者更一般地说,
foo.(T)
。它是a,如果接口没有保存请求的类型,它将在运行时死机。您可以使用
x,ok:=foo.(int)
其中x将是零值,如果类型断言失败,
ok
将为false。OP没有提到名称,但清楚地知道该功能(最初的示例就是这样显示的)这里的问题是关于一个任意类型的动态选择。事实上,通过直接赋值(但没有得到任何结果):
someTypeAge:=interfaceeage
。你可以将
interface{}
类型的数据传递到你的内心——以及某些函数,例如
fmt.Println(接口图)
,将动态处理数据。谢谢。我不明白的是,为什么Go是静态类型的,这意味着你不能在运行时转换类型。例如,在C#中,你可以这样做,而C#也是一种静态类型语言。你能详细说明一下吗?@orcaman:我想你可能把接口和泛型混淆了。类型of值在运行时总是已知的,因为它是在编译时已知的。它们在Go中也有很好的定义。@orcaman在C#中,您的类型将使用
var
进行推断。就像在Go中一样。如果要显式定义类型,还必须显式将其转换为所需的类型(除非装箱).所以,我不确定我是否能将您与C进行比较-情况也是如此。现在,如果您谈论的是
动态
,那么这是一个完全不同的野兽,当然不能保证编译时类型的安全性。@SimonWhitehead谢谢。在C#示例中,我的意思是您可以执行以下操作:var type=obj.GetType();将Activator.CreateInstance(type)返回为T;以创建任何类型的实例,而不事先知道该类型。在go中,我可以动态获取该类型,但我似乎无法创建该类型的变量(如果我自己不编写一个丑陋的switch语句来覆盖所有类型)。为什么不提及?这似乎是(几乎是?)这正是OP想要的。
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
}