为什么指针指针指向涉及指针的类型定义是非法的?

Iza*_*aan 3 pointers go

我有以下代码:

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.根据我一直在阅读的内容,我的理解是两种作业都应该有效,或者它们都不应该有效.描述的行为是不是有点不一致?

icz*_*cza 6

这完全由Spec:Assignability "治理" .分配到test_3以下内容:

在任何这些情况下,值x都可分配给类型变量T(" x可赋予T"):

并且没有任何可转让性规则涵盖test_4,因此不允许这样做.

基本类型是中详述规格:类型:

每种类型T都有一个基础类型:If T是预先声明的布尔,数字或字符串类型之一,或类型文字,相应的基础类型T本身.否则,T底层类型是T类型声明中引用的类型的基础类型.

在以下情况下test_3:

var test_3 VertexPointer = &v
Run Code Online (Sandbox Code Playgroud)

类型test_3VertexPointer(明确指定),类型&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.基础类型不匹配.因此,没有适用的可分配性规则,因此此分配不正确.

看到类似的问题:传递给自定义类型作为参数