golang slice分割和append copy还是引用
转载自:http://studygolang.com/articles/724
1.
slice1:= slice[0:2]
引用,非复制,所以任何对slice1或slice的修改都会影响对方
data := []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 0}
data1 := data[0:2]
data1[0] = 99
fmt.Println(data1)
fmt.Println(data)
[99 2]
[99 2 3 4 5 6 7 8 9 0]
2.append
append 比较特殊
声明:
源slice= src
添加slice = app
结果slice=tar
1)如果len(src) + len(app) <= cap(src) src和tar 是指向同一数据引用 ,即修改src或tar,会影响对方
2)否则 tar 是copy的方式 src + app ,即修改src或tar,不会影响对方
无论哪种情况不会影响app,因为app都会用copy的方式进入tar
func test2() {
data := make([]int, 10, 20)
data[0] = 1
data[1] = 2
dataappend := make([]int, 10, 20)//len <=10 则 result[0] = 99 会 影响源Slice
dataappend[0] = 1
dataappend[1] = 2
result := append(data, dataappend...)
result[0] = 99
result[11] = 98
fmt.Println("length:", len(data), ":", data)
fmt.Println("length:", len(result), ":", result)
fmt.Println("length:", len(dataappend), ":", dataappend)
} 3.
另外我自己补充一点:
其中CounterAdapter是一个结构体
list := make([]CounterAdapter, 0)
ca := CounterAdapter{}
for i := 1; i <= 3; i++ {
ca.Data.Cycle = int64(i)
ca.Data.HostName = fmt.Sprintf("%d", i)
list = append(list, ca)
}
fmt.Println(list)
输出的list的3个结点分别是不一样的,得出结果,append单个结构体是copy的
golang slice分割和append copy还是引用的更多相关文章
- Golang Slice 总结
数组 Go的切片是在数组之上的抽象数据类型,因此在了解切片之前必须要要理解数组.数组类型由指定和长度和元素类型定义.数组不需要显式的初始化:数组元素会自动初始化为零值:Go的数组是值语义.一个数组变量 ...
- golang slice 源码解读
本文从源码角度学习 golang slice 的创建.扩容,深拷贝的实现. 内部数据结构 slice 仅有三个字段,其中array 是保存数据的部分,len 字段为长度,cap 为容量. type s ...
- golang slice 使用及源码分析
1.先做个小实验 func main(){ s1:=make([]int,0,10) s1=[]int{1,2,3} ss:=make([]int,0,10) ss = s1[1:] for i:=0 ...
- golang slice 切片原理
golang 中的 slice 非常强大,让数组操作非常方便高效.在开发中不定长度表示的数组全部都是 slice .但是很多同学对 slice 的模糊认识,造成认为golang中的数组是引用类型,结果 ...
- golang slice学习
关于获取slice相关内存地址操作 s := make([]int, 1) t.Log(unsafe.Pointer(&s))// 获取当前slice 结构体实例的内存地址 t.Log(uns ...
- 【转】 golang slice array
1. array 同一类型数据的集合 var arr [n]type //声明type类型一维数组 var arr [m][n]type //声明type类型二维数组 ...
- golang slice
golang 在for range一个slice时,会读出其cap长度.在for的过程中,即使动态append该slice,最终for也会在第一次读取的cap长度处停止. package main i ...
- golang slice切片的原理以及内置函数cap, len
golang中slice(切片)是常用的类型, slice是对数组进行封装 package main import ( "fmt" "strconv") fun ...
- golang——slice使用摘要
1.slice因capacity不足而重新分配的underlying array与原本的array空间是断裂的,就是说这是原本指向的空间没变,如下 arr := [...]int{1, 2, 3, 4 ...
随机推荐
- 利用BLKTRACE分析IO性能
在Linux系统上,如果I/O发生性能问题,有没有办法进一步定位故障位置呢?iostat等最常用的工具肯定是指望不上的,[容易被误读的iostat]一文中解释过await表示单个I/O所需的平均时间, ...
- Taro项目遇到的问题
1. https://taro-ui.aotu.io/#/docs/questions 请在Taro项目根目录找到 config/index.js 文件中的h5项,添加如下: h5: { ... es ...
- day22---面向对象基础初识
面向过程编程: 核心是过程两个字,指的是解决问题的步骤,即先干什么再干什么,基于面向过程设计的程序就好比在设计一条流水线,是一种机械的思维方式. 优点:复杂问题流程化, 缺点:程序的可扩展性差 面向对 ...
- 机器人行业中我们常说的roll、yaw、pitch是什么?
坐标系建立: 载体坐标系与载体坐标系的关系是三个Euler角:yaw,pitch,roll,反应了载体相对基准面的姿态. pitch是围绕X轴旋转,也叫做俯仰角.当X轴的正半轴位于过坐标原点的水平面之 ...
- python之pickle
#!/usr/bin/python # -*- coding: UTF- -*- ''' ''' import pickle # pickle 只能Python识别 不适用于别的语言 li = [, ...
- 迷茫<第二篇:回到老家湖南长沙>
2014年8月初,我买了回老家的火车票,当时没有买到坐票,卧铺贵了买不起,所以我就选择了站票,准备站回老家.我现在还记得我当时买的是T1列火车,北京西站到长沙火车站,全程16个小时.当时我就在火车上站 ...
- [properJavaRDP]在网页中实现远程连接
内容摘要: 利用开源软件properJavaRDP实现远程桌面连接 如何让Applet嵌入到网页中正常运行 如何处理连接win7时的异常:Wrong modulus size! Expected 64 ...
- JS--编码规范
1. 请修复给定的 js 代码中,函数定义存在的问题 function functions(flag) { if (flag) { function getValue() { return 'a'; ...
- Git—分支管理
Git—分支管理 分支学习:branch称为分支,默认仅有一个名为master的分支.一般开发新功能流程为:开发新功能时会在分支dev上进行,开发完毕后再合并到master分支. branch相关常用 ...
- 《Effective C++》模板与泛型编程:条款32-条款40
条款41:了解隐式接口和编译期多态 class支持显示接口和运行期多态 class的显示接口由函数的名签式构成(函数名称.参数类型.返回类型) class的多态通过virtual函数发生在运行期 te ...