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规范。