https://github.com/golang/go/blob/master/src/container/list/list.go#L49
我很难在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在将root
和next
定义为指针时将prev
定义为非指针值?
由于
答案 0 :(得分:1)
默认情况下,指针为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
,这是必要的,否则结构定义将是递归,这是不允许的,因为它理论上会导致无限大小的结构......