Go 为什么我可以为变量指定不同类型的值?

Go 为什么我可以为变量指定不同类型的值?,go,Go,在《行动起来》一书中,作者写道“两种不同类型的值不能相互分配,即使它们是兼容的” 例如,我们不能将Duration分配给int64或int64分配给Duration 但这并不总是正确的,以下赋值的工作方式类似于将X值自动转换回[]int: type X []int var v []int = X([]int{1, 2, 3}) 这两种情况的区别是什么?我会让您参考以下内容,并在这里摘录最有意义的内容: 在以下任何情况下,值x可分配给T类型的变量(“x可分配给T”): x的类型V和T具有相同

在《行动起来》一书中,作者写道“两种不同类型的值不能相互分配,即使它们是兼容的”

例如,我们不能将
Duration
分配给
int64
int64
分配给
Duration

但这并不总是正确的,以下赋值的工作方式类似于将
X
值自动转换回
[]int

type X []int
var v []int = X([]int{1, 2, 3})
这两种情况的区别是什么?

我会让您参考以下内容,并在这里摘录最有意义的内容:

在以下任何情况下,值x可分配给T类型的变量(“x可分配给T”):

  • x的类型V和T具有相同的底层类型,并且V或T中至少有一个不是命名类型
在您的示例中,每种情况的基础类型都是
[]int
,而
[]int
不是命名类型,而是切片。
int
实际上将构成一个命名类型(在universe块中预先声明),并将自身作为一个基础类型,但
[]int
并非详细说明的命名类型:

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

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

因此,如果您尝试将
type X int
分配给
var v int
,因为
int
是一种命名类型,不符合规范中给出的可分配标准