Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Pointers 为什么为涉及指针的类型定义指定指针到指针是非法的?_Pointers_Go - Fatal编程技术网

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

Pointers 为什么为涉及指针的类型定义指定指针到指针是非法的?,pointers,go,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 = &

我有以下代码:

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\u 3
的作业有效,而不包含
test\u 4
。根据我一直在读的内容,我的理解是要么两个作业都有效,要么两个作业都无效。所描述的行为不是有点不一致吗?

这都是由用户“管理”的。分配给
测试_3
包括在以下内容中:

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

  • [……]

  • x
    的类型
    V
    T
    相同,并且
    V
    T
    中至少有一个不是类型

而且所有的可分配性规则都不包括
测试4
,因此这是不允许的

有关基础类型的详细信息,请参见

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

如果是
测试3

var test_3 VertexPointer = &v
test_3
的类型为
vertexinter
(明确指定),
&v
的类型为
*Vertex
。两者的基础类型都是
*顶点
,而
&v
(即
*顶点
)的类型是未命名的类型,因此赋值是确定的<代码>顶点是命名类型,但诸如
*顶点
[]顶点
等派生类型是未命名类型

如果是
测试4

var test_4 *VertexPointer = &v_ptr
test_4
的类型是
*顶点
&v_ptr
的类型是
**顶点
,因为
v_ptr
的类型是
*顶点
,而不是
顶点
test\u 4
的基本类型是
*vertexoptner
&v\u ptr
的基本类型是
**Vertex
。基础类型不匹配。因此没有适用的可分配性规则,因此此分配是正常的


请参阅类似的问题:

您的问题中没有任何类型别名。类型别名是
类型A=B
而不是
类型A B
@leaf那么
类型A B
我叫什么?我想使用
typedef
,但在围棋术语中似乎没有使用这个术语。它被称为类型定义。您可以阅读golang规范。