内容简介:输出输出为什么
golang值拷贝导致使用container/list出现的诡异问题分析
先看正确使用list的两种方式
-
使用list.New()
package main import ( "container/list" "fmt" ) func main() { lPtr := list.New() lPtr.PushBack(1) for front := lPtr.Front(); front != nil; front = front.Next() { fmt.Println(front.Value) } }输出
-
使用list.List{}
package main
import (
"container/list"
"fmt"
)
func main() {
l := list.List{}
l.PushBack(1)
for front := l.Front(); front != nil; front = front.Next() {
fmt.Println(front.Value)
}
}
输出
list的错误使用方式
package main
import (
"container/list"
"fmt"
)
func main() {
l := *list.New()
l.PushBack(1)
for front := l.Front(); front != nil; front = front.Next() {
fmt.Println(front.Value)
}
}
输出
<nil>
错误原因分析
为什么 *list.New()
方式给 l
后,放进 l
中的元素打印不出来了呢?
让我们来看看l.Front()中的逻辑, 如果 len
不为 0
,返回的是 l.root.next
func (l *List) Front() *Element {
if l.len == 0 {
return nil
}
return l.root.next
}
上面打印list的循环条件是 front != nil
,打印不出元素,也就说明 l.root.next==nil
那我们把 l.root.next
的地址打印出来看看, 当 len!=0
时才会返回 l.root.next
,我们要先添加一个元素
package main
import (
"container/list"
"fmt"
)
func main() {
lPtr := list.New()
lPtr.PushBack("ptr1")
fmt.Printf("lPtr=%p lPtr.root.next=%p\n", lPtr, lPtr.Front())
l := *lPtr
l.PushBack(1)
fmt.Printf("&l=%p l.root.next=%p\n", &l, l.Front())
for front := l.Front(); front != nil; front = front.Next() {
fmt.Println(front.Value)
}
}
输出
lPtr=0xc000084150 lPtr.root.next=0xc000084180 &l=0xc0000841b0 l.root.next=0xc000084180 ptr1 1 <nil>
我们看到 l.root.next
的值 lPtr.root.next
的值都是 0xc000084180
, 问题就出在这里
向 lPtr
添加元素 "ptr1"
后, lPtr
内部链表如下
lPtr.root.prev->Element{"ptr1"}->&lPtr.root //Element{"ptr1"}地址:0xc000084180
lPtr.root.next->Element{"ptr1"}->&lPtr.root
当 l := *lPtr
时,内部属性的值拷贝如下:
l.root.prev->Element{"ptr1"}->&lPtr.root //Element{"ptr1"}地址:0xc000084180
l.root.next->Element{"ptr1"}->&lPtr.root
向 l
添加元素 "1"
后, l
内部链表如下
l.root.prev->Element{"1"}->Element{"ptr1"}->&lPtr.root
l.root.next->Element{"ptr1"}->Element{"1"}->&lPtr.root
至此就是弄清楚了上面发生怪异输出结果的原因了。
注意:在 go 中尽量避免对复杂对象做简单的值传递赋值。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
硅谷增长黑客实战笔记
曲卉 / 机械工业出版社 / 2018-4-10 / 65.00元
增长黑客这个词源于硅谷,简单说,这是一群以数据驱动营销、以迭代验证策略,通过技术手段实现爆发式增长的新型人才。近年来,互联网公司意识到这一角色可以发挥四两拨千斤的作用,因此对该职位的需求也如井喷式增长。 本书作者曾在增长黑客之父肖恩•埃利斯麾下担任增长负责人,用亲身经历为你总结出增长黑客必备的套路、内力和兵法。本书不仅有逻辑清晰的理论体系、干货满满的实践心得,还有Pinterest、SoFi......一起来看看 《硅谷增长黑客实战笔记》 这本书的介绍吧!