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

问题描述:

作者在“Go in Action”一书中写道:“两种不同类型的值不能相互赋值,即使它们兼容”。为什么我可以为变量分配不同类型的值?

例如,我们不能将Duration指定为int64int64Duration

但是,这并不总是正确的,下面的任务将努力像X值转换回[]int自动:

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

什么是这两种情况的区别?

我将把你的spec这里摘取最有意义的台词:

的X值是分配给类型T的变量在任何的这些(“x是分配给T”)例:

...

  • X的V型和T具有相同的基础类型和V中的至少一种或T不是命名类型。

在您的示例的基础类型是[]int每个案例和[]int不命名类型,但一个切片。一个int实际上会构成一个命名的类型(在宇宙中的块预先声明)和将具有本身作为一个基本的类型,但[]int不是命名类型为详细here

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

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

因此,如果你试图使type X int能够将其分配到var v intint被命名类型和做是不符合规范给出的可转让性标准。