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