在Go中为变量分配类型

时间:2017-07-25 06:10:42

标签: 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) {...}

4 个答案:

答案 0 :(得分:2)

  

是否有这样的机制允许我这样做?

没有。

答案 1 :(得分:1)

  

是否有这样的机制允许我这样做?

简短回答是:否。

答案很长:这听起来像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中的特殊功能(或缺少它)。

答案 2 :(得分:0)

在go中没有这样的东西,但类型别名可以做你需要的:

department

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

type MyInt int

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

Playground

答案 3 :(得分:0)

使用空接口:

var x, y interface{}
var a uint32
a = 255
x = int8(a)
y = uint8(a)

Playground example