从非指针结构元素转到链表指针赋值

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没有必要是一个指针,但是,对于prevnext是必要的,否则结构定义将是递归的,这是不允许的,因为理论上它会导致无限大小的结构...