从非指针结构元素转到链表指针赋值
Go linked list pointer assignment from non-pointer struct element
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 的原始 container/list 代码相同
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
时将 root
定义为非指针值,而将 prev
定义为指针?
谢谢
指针默认为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
是必要的,否则结构定义将是递归的,这是不允许的,因为理论上它会导致无限大小的结构...
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 的原始 container/list 代码相同
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
时将 root
定义为非指针值,而将 prev
定义为指针?
谢谢
指针默认为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
是必要的,否则结构定义将是递归的,这是不允许的,因为理论上它会导致无限大小的结构...