最近踩了一个go的坑,而这个坑的根本原因就是slice和arry的区别理解不清楚导致的。

一、问题提出,slice在被复制之后,修改复制之后的那个slice内容,结果复制之前的slice内容也变化了。

我们先来看一段代码:

package mainimport ("fmt""reflect"
)func main() {var arr [8]int = [8]int{1}var arr1 [8]intvar slice, slice1 []intfmt.Println("type of:", reflect.TypeOf(arr), reflect.TypeOf(slice))arr1 = arrfmt.Println("1: arr|arr1 of:", arr, arr1)arr1 = [8]int{3}fmt.Println("2: arr|arr1 of:", arr, arr1)slice = append(slice, 2)slice1 = slicefmt.Println("3: slice|slice1 of:", slice, slice1)slice1[0]= 5fmt.Println("4: slice|slice1 of:", slice, slice1)
}
output:
type of: [8]int []int
1: arr|arr1 of: [1 0 0 0 0 0 0 0] [1 0 0 0 0 0 0 0]
2: arr|arr1 of: [1 0 0 0 0 0 0 0] [3 0 0 0 0 0 0 0] // 只是修改的那个变化了
3: slice|slice1 of: [2] [2]
4: slice|slice1 of: [5] [5] // 好奇怪,怎么都更改了呢

结果分析:

看到输出结果,笔者开始是蒙的,怎么两种[8]int,[]int的复制会有两个结果呢?arry的复制之后,两个arry都是独立的,slice的复制之后,内容却会同时变化。

二、问题原因

开始之前,我们先看下什么是slice,什么是arry?

例子:

var arr [8]int // 这种指定了长度的数组就是arry类型,复制都是值的复制一份。

var slice []int // 这种 就是slice类型,更像是指针,复制操作其实就是操作指针的公共地址。

Go中将arry和slice当作了两种数据类型,一个是与int等基本类型具有相同的特征,一个是引用类型与指针和interface具有相同的特征。也正是这个区别,导致了上面代码里面的操作,输出结果会有这种不同。

这种问题,当发生在[8]int赋值给[:]int的时候,会潜移默化的将arry类型转换成slice类型,而我们一旦后续修改了赋值之后的数据,就会踩这个坑,[8]int内存中的数据也被改掉了。


灰子学技术:

Go slice和arry的区别相关推荐

  1. slice 和splice 的区别 js

    slice 和splice 的区别js slice 定义和用法 一个参数 正数 负数 两位参数 正数 负数 splice 定义和用法 两个参数 正数 负数 单一个参数 正数 负数 今天写一道算法题时候 ...

  2. slice与split的区别

    slice与split的区别 slice 定义:接收一个或两个参数,它可以创建一个由当前数组中的一项或多项组成的新数组,注意是新数组哦~ 也就是说它不会修改原来数组的值.  用法:slice( par ...

  3. 数组首地址arry和arry的区别

    今天在梳理指针地址的问题中,突然发现数组首地址都能用arry和&arry来表示.所以网上查找了一下这两个区别,总结如下. 1. 区别 int arry[5] = {0}; arry      ...

  4. golang中数组和slice作为参数的区别

    最近项目中有遇到类似问题,做个记录. 举个例子,[5]int为数组,[]int为slice(数组切片),数组是值类型,而slice为引用类型,值类型作为参数传入函数,只是拷贝了个副本,修改并不会作用到 ...

  5. slice,substring,substr的区别

    1.都为正整数//例子数据 var arr = [1,2,3,4,5,6,7], var str = "helloworld!"; //注意这里有个!号也算一位若有空格,空格也算一 ...

  6. JS中数组和字符串具有的方法,以及substring,substr和slice的用法与区别

     String 对象属性 属性 描述 constructor 对创建该对象的函数的引用 length 字符串的长度 prototype 允许您向对象添加属性和方法 String 对象方法 方法 描述 ...

  7. 数组方法 splice()与slice()的区别

    slice() slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么 ...

  8. slice,split,splice的区别与用法

    1.slice:截取数组,返回截取到的新数组,不改变原有数组       arr.slice(start,end);       start:必需,从原数组的start位置开始截取(包括下标为star ...

  9. JS中slice,splice,split的区别

    1.slice : 定义:接收一个或两个参数,它能够建立一个由当前数组中的一项或多项组成的新数组,注意是新数组哦~ 也就是说它不会修改原来数组的值. 用法:slice( para1 ),会截取从par ...

最新文章

  1. [软件工程基础]团队作业Week3
  2. Malware FAQ: How does the Ptrace exploit work o...
  3. Min_25筛学习Tip+链接
  4. 伙伴分配器的一个极简实现
  5. java实验的总结_java实验总结
  6. unity 是厘米还是米_做工扎实,可玩性强,类乐高产品的好选择,米兔积木工程吊车...
  7. WPF 文字换行TextWrapping 显示不全用省略号TextTrimming 显示不全弹提示内容ToolTip
  8. 扫描软件(to be followed)
  9. PDF加密以及去除密码小妙招
  10. 推荐几个编程学习网站
  11. OSChina 周五乱弹 —— 是时候动手了
  12. JAVA生成纯色背景图-自定义大小-自定义颜色
  13. kaggle上面的E-Commerce Data数据集练习(可视化与部分特征工程)
  14. 时间序列 预处理 python_时间序列算法理论及python实现(1-算法理论部分)
  15. 小程序下载图片、文件、wx.downloadFile,废话少说直接上代码
  16. Maven中Scop为test时Eclispe中需要注意的地方
  17. mysql查询每行重复_MySQL查询返回重复的行
  18. 跳一跳改分php源码,小游戏“跳一跳”居然可改分,微信小程序现漏洞
  19. 计算机计算公式单组数据求乘法,(excel表格全部数据怎么乘以一个数啊)
  20. Precision(精确率,正确率), Recall(召回率,查全率),Accuracy(准确率),F-Measure(F值)...

热门文章

  1. filename=文件夹名+filename (单个文件夹下的+Python)
  2. 利用Medium的CDN来改善Feed的页面加载时间
  3. #一日一图#自己的小窝舒服
  4. 计算机c盘能备份数据吗,怎么备份C盘数据
  5. 用树莓派做服务器运行博客网页
  6. php取tet文件内容,PHP中使用PDFlib TET提取PDF中的文本
  7. codeforces 1665A (GCD vs LCM)思维
  8. Memory基本debug指令与基础知识(一)
  9. Python 汉字转化成拼音
  10. jzoj. 4298. 【NOIP2015模拟11.2晚】我的天