从非指针struct元素转到链表列表指针

时间:2015-03-10 15:48:08

标签: pointers go linked-list

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在将rootnext定义为指针时将prev定义为非指针值?

由于

1 个答案:

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