[英]Go linked list pointer assignment from non-pointer struct element
https://github.com/golang/go/blob/master/src/container/list/list.go#L49
我很难理解为什么我cannot assign to pointer
在Go中cannot assign to pointer
错误。
这是有效的代码: http : //play.golang.org/p/P9FjK8A-32 ,与Go的原始容器/列表代码相同
type List struct {
root Element
len int
}
type Element struct {
next, prev *Element
list *List
Value interface{}
}
原始代码将root
作为值,并在每次需要使用指针类型时都引用它,但为什么不首先将root
定义为指针呢?
type List struct {
root *Element
len int
}
type Element struct {
next, prev *Element
list *List
Value interface{}
}
这给我一个错误: http : //play.golang.org/p/1gCAR_rcx1- > invalid memory address or nil pointer dereference
为什么会出现此错误? 为什么Go在将next
和prev
定义为指针时将root
定义为非指针值?
谢谢
指针默认为nil
,需要初始化。
这个:
// Init initializes or clears list l.
func (l *List) Init() *List {
l.root.next = l.root
l.root.prev = l.root
l.len = 0
return l
}
应该变成这个:
// Init initializes or clears list l.
func (l *List) Init() *List {
l.root = new(Element) // necessary to avoid dereferencing a nil pointer
l.root.next = l.root
l.root.prev = l.root
l.len = 0
return l
}
演示在http://play.golang.org/p/EYSscTMYnn
对于标准库,没有必要让root
成为指针,但是,对于prev
和next
则是必须的,否则struct定义将是递归的,这是不允许的,因为从理论上讲它将导致struct无限大小...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.