我有以下代码:
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
无效。根据我一直在阅读的内容,我的理解是两种作业都应该有效,或者它们都不应该有效。所描述的行为是不是有点不一致?
答案 0 :(得分:6)
这完全由objective-c++“管理”。分配给test_3
的内容包括:
值
x
可分配给T
类型的Spec: Assignability(“x
可分配给T
”)在以下任何一种情况下:< / p>
[...]
x
的类型V
和T
具有相同的variable,且V
或T
中至少有一个不是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
是一种命名类型,但[]Vertex
或test_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