成都网站建设设计

将想法与焦点和您一起共享

怎么拷贝golang的slice

slice理解

创新互联专业为企业提供安陆网站建设、安陆做网站、安陆网站设计、安陆网站制作等企业网站建设、网页设计与制作、安陆企业网站模板建站服务,十余年安陆做网站经验,不只是建网站,更提供有价值的思路和整体网络服务。

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

slice 方法返回一个包含 stringObj 的指定部分的 String 对象。

slice 方法一直复制到 end 所指定的元素,但是不包括该元素。如果 start 为负,将它作为 length + start处理,此处 length 为数组的长度。如果 end 为负,就将它作为 length + end 处理,此处 length 为数组的长度。如果省略 end ,那么 slice 方法将一直复制到 arrayObj 的结尾。如果 end 出现在 start 之前,不复制任何元素到新数组中。

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

只有深刻理解这三个属性才能在使用slice中不至于犯错。                               

正确理解变量和共享

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

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

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

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)
}

运行结果

a1= [1 999 3 4 5 6] a2= [1 999 3 4 5 6] a3= [999 3]
Process finished with exit code 0

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

什么时候不会修改

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)
}

运行结果

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的slice
分享路径:http://chengdu.cdxwcx.cn/article/peddjs.html