为什么我可以为变量分配不同类型的值?
问题描述:
作者在“Go in Action”一书中写道:“两种不同类型的值不能相互赋值,即使它们兼容”。为什么我可以为变量分配不同类型的值?
例如,我们不能将Duration
指定为int64
或int64
至Duration
。
但是,这并不总是正确的,下面的任务将努力像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 int
为int
被命名类型和做是不符合规范给出的可转让性标准。