• 技术文章 >后端开发 >Golang

    golang slice如何拷贝

    (*-*)浩(*-*)浩2019-12-17 11:24:17原创2190

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

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

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

    正确理解变量和共享

    多个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如何拷贝的详细内容,更多请关注php中文网其它相关文章!

    声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn核实处理。
    专题推荐:golang
    上一篇:golang slice检查元素是否存在 下一篇:自己动手写 PHP MVC 框架(40节精讲/巨细/新人进阶必看)

    相关文章推荐

    • golang gf怎么使用• golang gin怎么安装• golang byte是什么• golang快不快
    1/1

    PHP中文网