Go slice和arry的区别
最近踩了一个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的区别相关推荐
- slice 和splice 的区别 js
slice 和splice 的区别js slice 定义和用法 一个参数 正数 负数 两位参数 正数 负数 splice 定义和用法 两个参数 正数 负数 单一个参数 正数 负数 今天写一道算法题时候 ...
- slice与split的区别
slice与split的区别 slice 定义:接收一个或两个参数,它可以创建一个由当前数组中的一项或多项组成的新数组,注意是新数组哦~ 也就是说它不会修改原来数组的值. 用法:slice( par ...
- 数组首地址arry和arry的区别
今天在梳理指针地址的问题中,突然发现数组首地址都能用arry和&arry来表示.所以网上查找了一下这两个区别,总结如下. 1. 区别 int arry[5] = {0}; arry ...
- golang中数组和slice作为参数的区别
最近项目中有遇到类似问题,做个记录. 举个例子,[5]int为数组,[]int为slice(数组切片),数组是值类型,而slice为引用类型,值类型作为参数传入函数,只是拷贝了个副本,修改并不会作用到 ...
- slice,substring,substr的区别
1.都为正整数//例子数据 var arr = [1,2,3,4,5,6,7], var str = "helloworld!"; //注意这里有个!号也算一位若有空格,空格也算一 ...
- JS中数组和字符串具有的方法,以及substring,substr和slice的用法与区别
String 对象属性 属性 描述 constructor 对创建该对象的函数的引用 length 字符串的长度 prototype 允许您向对象添加属性和方法 String 对象方法 方法 描述 ...
- 数组方法 splice()与slice()的区别
slice() slice() 方法可从已有的数组中返回选定的元素. 语法 arrayObject.slice(start,end) 参数 描述 start 必需.规定从何处开始选取.如果是负数,那么 ...
- slice,split,splice的区别与用法
1.slice:截取数组,返回截取到的新数组,不改变原有数组 arr.slice(start,end); start:必需,从原数组的start位置开始截取(包括下标为star ...
- JS中slice,splice,split的区别
1.slice : 定义:接收一个或两个参数,它能够建立一个由当前数组中的一项或多项组成的新数组,注意是新数组哦~ 也就是说它不会修改原来数组的值. 用法:slice( para1 ),会截取从par ...
最新文章
- [软件工程基础]团队作业Week3
- Malware FAQ: How does the Ptrace exploit work o...
- Min_25筛学习Tip+链接
- 伙伴分配器的一个极简实现
- java实验的总结_java实验总结
- unity 是厘米还是米_做工扎实,可玩性强,类乐高产品的好选择,米兔积木工程吊车...
- WPF 文字换行TextWrapping 显示不全用省略号TextTrimming 显示不全弹提示内容ToolTip
- 扫描软件(to be followed)
- PDF加密以及去除密码小妙招
- 推荐几个编程学习网站
- OSChina 周五乱弹 —— 是时候动手了
- JAVA生成纯色背景图-自定义大小-自定义颜色
- kaggle上面的E-Commerce Data数据集练习(可视化与部分特征工程)
- 时间序列 预处理 python_时间序列算法理论及python实现(1-算法理论部分)
- 小程序下载图片、文件、wx.downloadFile,废话少说直接上代码
- Maven中Scop为test时Eclispe中需要注意的地方
- mysql查询每行重复_MySQL查询返回重复的行
- 跳一跳改分php源码,小游戏“跳一跳”居然可改分,微信小程序现漏洞
- 计算机计算公式单组数据求乘法,(excel表格全部数据怎么乘以一个数啊)
- Precision(精确率,正确率), Recall(召回率,查全率),Accuracy(准确率),F-Measure(F值)...
热门文章
- filename=文件夹名+filename (单个文件夹下的+Python)
- 利用Medium的CDN来改善Feed的页面加载时间
- #一日一图#自己的小窝舒服
- 计算机c盘能备份数据吗,怎么备份C盘数据
- 用树莓派做服务器运行博客网页
- php取tet文件内容,PHP中使用PDFlib TET提取PDF中的文本
- codeforces 1665A (GCD vs LCM)思维
- Memory基本debug指令与基础知识(一)
- Python 汉字转化成拼音
- jzoj. 4298. 【NOIP2015模拟11.2晚】我的天