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

时间:2018-01-26 11:46:22

标签: 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
}

当我尝试运行它(我正在使用Go 1.6.2)时,我收到以下错误:

# command-line-arguments
./pointers.go:17: cannot use &v_ptr (type **Vertex) as type *VertexPointer in assignment

我很困惑为什么涉及test_3的作业有效而test_4无效。根据我一直在阅读的内容,我的理解是两种作业都应该有效,或者它们都不应该有效。所描述的行为是不是有点不一致?

1 个答案:

答案 0 :(得分:6)

这完全由“管理”。分配给test_3的内容包括:

  

x可分配给T类型的Spec: Assignability(“x可分配给T”)在以下任何一种情况下:< / p>      

      
  • [...]

  •   
  • x的类型VT具有相同的variable,且VT中至少有一个不是test_4 underlying types类型。

  •   

并且所有可分配性规则都不涵盖T,因此不允许这样做。

基础类型详见defined

  

每种类型T都有基础类型:如果T是预先声明的布尔值,数字或字符串类型之一,或类型文字,则相应的基础类型是T本身。否则,T的基础类型是test_3在其Spec: Types:中引用的类型的基础类型。

如果是var test_3 VertexPointer = &v

test_3

VertexPointer的类型为&v(明确指定),*Vertex的类型为*Vertex。两者的基础类型为&v*Vertex的类型(Vertex)是未命名的类型,因此分配正常。 *Vertex是一种命名类型,但[]Vertextest_4等派生类型是未命名的类型。

如果是var test_4 *VertexPointer = &v_ptr

test_4

*VertexPointer的类型为&v_ptr**Vertex的类型为v_ptr,因为*Vertex的类型为VertexPointer,而不是test_4 }。基础类型*VertexPoitner&v_ptr,基础类型**Vertex为{{1}}。基础类型不匹配。因此,没有适用的可分配性规则,因此此分配确定。

查看类似问题:type declaration