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

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

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

正确理解变量和共享

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

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

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复制的时候,如果面临多个变量同时指向一个数组的时候,一定要考虑到数据的共享和内存的重新分配。

更多相关文章

  1. golang判断数组是否为空的方法
  2. golang如何删除数组中的元素
  3. golang数组与切片的区别是什么?
  4. golang数组和切片的区别是什么
  5. golang 数组存的是什么
  6. golang怎么判断数组是否为空
  7. golang数组与切片的不同之处
  8. golang怎么拼接字符串数组
  9. golang如何定义一个二维数组

随机推荐

  1. RelativeLayout相对布局实验
  2. Android 4.2启动代码分析(一)
  3. Android深入四大组件(一)应用程序启动过程
  4. android 相对定位布局方向 RelativeLayou
  5. android photoview 图片放大缩放功能 Ima
  6. Android(安卓)Service服务的相关介绍
  7. android所有控件
  8. android单选按钮RadioGroup的详细使用
  9. Android 单选队列 RadioGroup与RadioButt
  10. 48.Android(安卓)标签TextView的点击技巧