【问题标题】:Go linked list pointer assignment from non-pointer struct element从非指针结构元素转到链表指针分配
【发布时间】:2015-05-12 03:36:55
【问题描述】:

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

谢谢

【问题讨论】:

    标签: pointers go linked-list


    【解决方案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 是必须的,否则结构定义会递归,这是不允许的,因为理论上它会导致一个无限大小的结构......

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-16
      • 2017-01-04
      • 1970-01-01
      • 2013-12-13
      • 1970-01-01
      • 2013-05-26
      • 1970-01-01
      • 2015-03-20
      相关资源
      最近更新 更多