为什么我可以为变量分配不同类型的值?

时间:2016-05-14 01:18:08

标签: go

在书" Go in Action"中,作者写了"两种不同类型的值不能彼此分配,即使它们是兼容的"。

例如,我们无法将Duration分配给int64int64分配给Duration

但情况并非总是如此,以下分配可以像X值自动转换回[]int一样:

type X []int
var v []int = X([]int{1, 2, 3})

这两种情况之间有什么区别?

1 个答案:

答案 0 :(得分:12)

我会将您推荐给spec,并在此处摘录最有意义的一行:

  

在任何这些情况下,值x都可分配给类型为T的变量(“x可赋予T”):

     

...

     
      
  • x的类型V和T具有相同的基础类型,并且V或T中的至少一个不是命名类型。
  •   

在您的示例中,每种情况的基础类型为[]int,而[]int不是命名类型,而是切片。 int实际上构成了一个命名类型(在Universe块中预先声明)并且自身将作为基础类型,但[]int不是详细here的命名类型:

  

布尔值,数字和字符串类型的命名实例   预声明。复合类型 - 数组,结构,指针,函数,   接口,切片,映射和通道类型 - 可以使用类型构造   文字。

     

每种类型T都有一个基础类型:如果T是预先声明的类型之一   布尔值,数字或字符串类型,或类型文字,   相应的底层类型是T本身。否则,T的底层   type是T在其类型中引用的类型的基础类型   声明。

因此,如果您尝试制作type X int,则 无法将其分配给var v int,因为int是一种命名类型,并且无法满足可转让性规范中给出的标准。