我对我的结构体包含list.List与*list.List之间的意外差异感到困惑。为什么以下内容不起作用?
type listHolder struct {
id int
mylist list.List
}
func newListHolder(id int, text string) listHolder {
var newLH listHolder
newLH.mylist = *list.New()
newLH.id = id
newLH.mylist.PushBack(text)
return newLH
}
func (l *listHolder) pushBack(text string) {
l.mylist.PushBack(text)
}
func (l *listHolder) printAll() {
for temp := l.mylist.Front(); temp != nil; temp = temp.Next() {
fmt.Println(temp.Value)
}
}
func main() {
a := newListHolder(1, "first")
a.pushBack("second")
fmt.Printf("listHolder %d length %d Front()= %v, Back()=%v\n",
a.id, a.mylist.Len(), a.mylist.Front().Value, a.mylist.Back().Value)
a.printAll()
}
这将输出如下结果,显示长度符合预期,但Front()和Back()方法无法使用。
listHolder 1 length 2 Front()= `<nil>`, Back()=<nil>
<nil>
如果我将结构定义为:
// Same thing with a pointer
type listHolderPtr struct {
id int
mylist *list.List
}
func newListHolderPtr(id int, text string) listHolderPtr {
var newLH listHolderPtr
newLH.mylist = list.New()
newLH.id = id
newLH.mylist.PushBack(text)
return newLH
}
这个结构体可以正常工作,但是显然,任何listHolder的副本都共享对同一列表的引用,这不是我想要的。 我需要能够复制周围的对象并获得内部列表的新副本。这可能吗?
请参见https://play.golang.org/p/KCtTwuvaS1R,了解我正在尝试做的事情的简化示例。在实际用例中,我将在列表中的每个listHolder中向后推送并弹出前面的内容,在一个复杂的嵌套循环中进行。
*list.List
吗? - JimB