前言
读者A:不会吧,阿Sir,这周这么高产~~~
asong:当然啦,为了你们,一切都值得~~~
读者B:净放臭屁屁,就你戏多~~~
asong:你凶人家,坏坏~~~
哈哈哈,戏太足了奥。自导自演可还行。今日分享之前,先放松放松嘛,毕竟接下来的知识,还是需要我们思考的。今天给大家分享的是go中的range,这个我们在实际开发中,是经常使用,但是他有一个坑,使用不好,是要被开除的。但是,今天你恰好看了我这一篇文章,就避免了这个坑,开心嘛~~~。直接笑,别克制,我知道你嘴角已经上扬了。
废话结束,我们直接开始。
正文
1. 指针数据坑
range到底有什么坑呢,我们先来运行一个例子吧。
package main
import (
"fmt"
)
type user struct {
name string
age uint64
}
func main() {
u := []user{
{
"asong",23},
{
"song",19},
{
"asong2020",18},
}
n := make([]*user,0,len(u))
for _,v := range u{
n = append(n, &v)
}
fmt.Println(n)
for _,v := range n{
fmt.Println(v)
}
}
这个例子的目的是,通过u
这个slice构造成新的slice。我们预期应该是显示u
slice的内容,但是运行结果如下:
[0xc0000a6040 0xc0000a6040 0xc0000a6040]
&{
asong2020 18}
&{
asong2020 18}
&{
asong2020 18}
这里我们看到n
这个slice打印出来的三个同样的数据,并且他们的内存地址相同。这是什么原因呢?先别着急,再来看这一段代码,我给他改正确他,对比之后我们再来分析,你们才会恍然大悟。
package main