golang slice如何拷贝


本文摘自php中文网,作者(*-*)浩,侵删。

golang 的slice是一个指向底层的数组的指针结构体。

这个结构体有三个属性,1.指向数组指针,2.len: slice中元素的数量 3.cap:slice占用内存数量。

只有深刻理解这三个属性才能在使用slice中不至于犯错。 (推荐学习:go)

正确理解变量和共享

多个slice之间可以共享底层的数据,并且引用的数组部分区间可能重叠

以上是golang 圣经中的一句话。深刻理解这句话对于日程编程非常有意义。

什么时候共享数据会被其他变量修改

1

2

3

4

5

6

7

8

func f1()  {

    a1 := []int{1,2,3,4,5,6}

    a2 := a1

    a3 := a1[1:3]

    a1[1] = 999

     

    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)

}

运行结果

1

2

a1= [1 999 3 4 5 6] a2= [1 999 3 4 5 6] a3= [999 3]

Process finished with exit code 0

我们清楚的看到了数据共享,此时修改了a1 ,两位两个变量都被修改

什么时候不会修改

1

2

3

4

5

6

7

8

func f2()  {

    a1 := []int{1,2,3,4,5,6}

    a2 := a1

    a3 := a1[1:3]

    a2 = append(a2,888)

    a1[1] = 999

    fmt.Println("a1=",a1,"a2=",a2,"a3=",a3)

}

运行结果

1

2

a1= [1 999 3 4 5 6] a2= [1 2 3 4 5 6 888] a3= [999 3]

Process finished with exit code 0

可以虽然a1被修改,a2并没有修改。我们知道append函数会面临内存的重新分配。所以等a2进行append的时候,会重新申请内存空间,将原有数组拷贝然后增加如新值。也就是当append操作的时候,此时a2 不在和a1 共享内存了。

在对slice复制的时候,如果面临多个变量同时指向一个数组的时候,一定要考虑到数据的共享和内存的重新分配。

以上就是golang slice如何拷贝的详细内容,更多文章请关注木庄网络博客!!

相关阅读 >>

golang 如何类型转换

我用go-zero开发了第一个线上项目

google官宣:新一代操作系统fuchsia编程语言竟然是它!

rabbitmq 消息丢失处理机制 confirm模式 [go 版本]

这可能是最容易理解的 go mutex 源码剖析

分享 echo-framework 项目基础框架

golang中协程图文详解

golang 入门系列(五)go语言中的面向对象

阅读golang 切片(slice)底层源码

中国身份证号验证库

更多相关阅读请进入《golang》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...