在书" Go in Action"中,作者写了"两种不同类型的值不能彼此分配,即使它们是兼容的"。
例如,我们无法将Duration
分配给int64
或int64
分配给Duration
。
但情况并非总是如此,以下分配可以像X
值自动转换回[]int
一样:
type X []int
var v []int = X([]int{1, 2, 3})
这两种情况之间有什么区别?
答案 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
是一种命名类型,并且无法满足可转让性规范中给出的标准。