2017-07-25 117 views
-1

如何让变量的类型为变量类型?在Go中为变量指定类型

这是什么意思?我有一个python和java背景。在这两种语言中,我都可以执行诸如将类名分配给变量的操作。

#Python 
class A: 
    def __init__(self): 
     self.a = "Some Value" 

# And asigning the class name to a variable 
class_A = A 

# And create instance from class A by using class_A 
a = class_A() 

有没有这样的机制让我这样做呢?在他们的文档中,我无法知道该在哪里寻找这些东西。老实说,通常我不知道这些在编程语言中被称为什么。

比如我想能够做到:

// For example, what would be the type of myType? 
var myType type = int 

我将利用这一机制,采取“类型”参数。例如:

func Infer(value interface{}, type gotype) {...} 

回答

2

有没有这样的机制可以让我做到这一点?

不,没有。

0

在旅途中有没有这样的事情,但型走样可以做你需要的东西:

type MyInt int 

func (num MyFloat) TestInt() int { 
    return int(num) 
} 

即使你的类型,你必须将它转换为类型为int,其你别名:

return num // Error 

Playground

0

有没有这样的机制让我去做?

简短的回答是:

长的答案是:这听起来像一个XY Problem,所以这取决于你实际上试图完成,有可能是一种方式。跳到最后查看我在哪里解决您的特定用例。

我怀疑如果你想在一个变量中存储一个数据类型,那是因为你要比较一些其他变量的类型,或者你想创建一个这个未知类型的变量。这两个场景可以在Go中完成。

在第一种情况下,仅仅使用一种类型的开关:

switch someVar.(type) { 
    case string: 
     // Do stringy things 
    case int: 
     // Do inty things 
} 

在语义上,这看起来很像分配的someVar类型隐含开关比较变量,则对各种类型的比较。

在我提到的第二种情况,如果你想创建一个未知类型的变量,这可以在一个迂回的方式使用反射来完成:

type := reflect.TypeOf(someVar) 
newVar := reflect.New(type).Interface() 

这里newVar现在是一个interface{}是包装与someVar相同类型的变量。

在你的具体的例子:

我将利用这一机制,采取“类型”参数。例如:

func Infer(value interface{}, type gotype) {...} 

没有,有没有办法做到这一点。对于Go的变量支持,它实际上与Go编译的事实相比较少得多。

变量完全是运行时的概念。函数签名(像Go中的所有其他类型)在编译时固定。因此,运行时变量不可能影响编译阶段。这在任何编译语言中都是如此,而不是Go中的一个特殊功能(或缺乏)。