繁体   English   中英

从非指针结构元素转到链接列表指针分配

[英]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在将nextprev定义为指针时将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成为指针,但是,对于prevnext则是必须的,否则struct定义将是递归的,这是不允许的,因为从理论上讲它将导致struct无限大小...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM