我有以下代码:
package main
type Vertex struct {
X, Y float64
}
type VertexPointer *Vertex
func main() {
v := Vertex{3, 4}
v_ptr := &v
var test_1 *Vertex = &v
var test_2 **Vertex = &v_ptr
var test_3 VertexPointer = &v
var test_4 *VertexPointer = &v_ptr
}
Run Code Online (Sandbox Code Playgroud)
当我尝试运行它(我正在使用Go 1.6.2)时,我收到以下错误:
# command-line-arguments
./pointers.go:17: cannot use &v_ptr (type **Vertex) as type *VertexPointer in assignment
Run Code Online (Sandbox Code Playgroud)
我很困惑为什么涉及test_3工作而不是工作test_4.根据我一直在阅读的内容,我的理解是两种作业都应该有效,或者它们都不应该有效.描述的行为是不是有点不一致?
这完全由Spec:Assignability "治理" .分配到test_3以下内容:
在任何这些情况下,值
x都可分配给类型变量T("x可赋予T"):
并且没有任何可转让性规则涵盖test_4,因此不允许这样做.
的基本类型是中详述规格:类型:
每种类型
T都有一个基础类型:IfT是预先声明的布尔,数字或字符串类型之一,或类型文字,相应的基础类型T本身.否则,T底层类型是T其类型声明中引用的类型的基础类型.
在以下情况下test_3:
var test_3 VertexPointer = &v
Run Code Online (Sandbox Code Playgroud)
类型test_3是VertexPointer(明确指定),类型&v是*Vertex.基础类型两者都是*Vertex,和类型&v(这是*Vertex)是一个未命名的类型,所以分配是OK.Vertex是一个命名类型,但派生类型,如*Vertex或未[]Vertex命名的类型.
在以下情况下test_4:
var test_4 *VertexPointer = &v_ptr
Run Code Online (Sandbox Code Playgroud)
类型test_4IS *VertexPointer,类型&v_ptr是**Vertex因为类型v_ptr是*Vertex,没有VertexPointer.底层类型test_4是*VertexPoitner,底层类型&v_ptr是**Vertex.基础类型不匹配.因此,没有适用的可分配性规则,因此此分配不正确.
看到类似的问题:传递给自定义类型作为参数