Golang 元素值在经过通道传递时会被复制,这个复制是浅复制
1. channel 元素值为切片
package mainimport ("fmt"
)func main() {ch := make(chan []int, 3)s := []int{1, 3, 4}ch <- sfmt.Printf("s length is %d, cap is %d\n", len(ch), cap(ch))fmt.Printf("s address is %p\n", &s)r := <-chr[0] = 2// 证明了channel的复制是浅拷贝fmt.Printf("s is %#v\n", s)fmt.Printf("r is %#v\n", r)fmt.Printf("r address is %p\n", &r)}
运行结果:
s length is 1, cap is 3
s address is 0xc00000c060
s is []int{2, 3, 4}
r is []int{2, 3, 4}
r address is 0xc00000c080
可以看到在接收端修改切片元素值,发送端的切片也被改变。
2. channel 元素值为数组
package mainimport ("fmt"
)func main() {ch := make(chan [3]int, 3)s := [3]int{1, 3, 4}ch <- sfmt.Printf("s length is %d, cap is %d\n", len(ch), cap(ch))fmt.Printf("s address is %p\n", &s)r := <-chr[0] = 2// 证明了channel的复制是浅拷贝fmt.Printf("s is %#v\n", s)fmt.Printf("r is %#v\n", r)fmt.Printf("r address is %p\n", &r)}
输出结果:
s length is 1, cap is 3
s address is 0xc0000aa000
s is [3]int{1, 3, 4}
r is [3]int{2, 3, 4}
r address is 0xc0000aa040
Go
语言里没有深层复制。只有浅复制 。数组是值类型,所以会被完全复制。
浅拷贝只是拷贝值以及值中直接包含的东西,深拷贝就是把所有深层次的结构一并拷贝。
首先你得理解,int
、float32
、string
以及 []int
这些类型都是值类型。对于值类型来说没有 “深层” 只有 “浅层”。也就是说,这类值只有一层,只包含值本身(不像 map
和 slice
那样包含了指向底层数据结构的指针)。对这类值的拷贝就是浅拷贝,根本就不存在深拷贝的概念。
浅表复制,只复制元素值,元素值里面再指向的东西就不会复制了。
Golang 元素值在经过通道传递时会被复制,这个复制是浅复制相关推荐
- 函数中参数有数组时注意的小问题(不一定要传递数组长度,不用返回数组,可以在函数中改变数组元素值)
函数中参数有数组时注意的小问题: 1.不一定要传递数组长度 2.不用返回数组,可以在函数中改变数组元素值 通过下面这个小例子来验证: #include<iostream> #include ...
- golang 键值对_对Golang地图的一些见解
golang 键值对 文章是关于地图的内部结构,哈希值和性能的. 数据实际上是如何存储在内部的. 基础概述 地图(又名关联数组)基本上是具有真正快速查找的键值存储. 真正的基本例子: m :=make ...
- [Eigen中文文档] 按值将Eigen对象传递给函数
文档总目录 本文目录 按值传递和按引用传递 Eigen的处理 英文原文(Passing Eigen objects by value to functions) 按值传递和按引用传递 按值传递:传入函 ...
- Redis中列表list数据类型(增加(在左侧、右侧或指定元素前后插入数据)、获取(获取表内指定范围的元素)、更新(获取指定索引位置的元素值)、删除(删除指定元素、count))
列表的元素类型为string 按照插⼊顺序排序 1. 增加 1.1 在左侧插⼊数据 lpush key value1 value2 ... 例1:从键为a1的列表左侧加⼊数据a . b .c lpus ...
- 顺序表-顺序表的基本操作(初始化+指定位置元素值 + 用元素值求下标)
顺序表的存储结构: typedef struct{int data[Maxsize]; //存在顺序表中的元素int length; //存放顺序表的长度}SqList; 一.初始化顺序表算法: vo ...
- 顺序表-给定的顺序表L中删除元素值在x到y(x<=y)之间的所有的元素
顺序表的存储结构: typedef struct{int data[Maxsize]; //存在顺序表中的元素int length; //存放顺序表的长度}SqList; 分析: 这题和删除顺序表所有 ...
- 顺序表-删除所有元素值为x结点(另建表存放+复制到原表)
顺序表的存储结构: typedef struct{int data[Maxsize]; //存在顺序表中的元素int length; //存放顺序表的长度}SqList; 分析: 这里要删除顺序表的所 ...
- 顺序表-删除所有元素值为x结点(相等加一,不等前移k)
顺序表的存储结构: typedef struct{int data[Maxsize]; //存在顺序表中的元素int length; //存放顺序表的长度}SqList; 分析: 这里要删除顺序表的所 ...
- OpenCV Python教程(2、图像元素的访问、通道分离与合并)
OpenCV Python教程之图像元素的访问.通道分离与合并 转载请详细注明原作者及出处,谢谢! 访问像素 像素的访问和访问numpy中ndarray的方法完全一样,灰度图为: [python] v ...
最新文章
- Github上传大于100M文件:LFS
- leaq c 汇编语言,汇编语言lea指令使用方法解析
- 前端抢饭碗系列之Vue项目如何做单元测试
- Android 手把手带你玩转自己定义相机
- 如何清除tomcat缓存
- PL SQL导入导出sql/dmp文件
- mysql 5.7 远程端口_ubuntu 16.04 mysql5.7.17 开放远程3306端口
- PyTorch实战福利从入门到精通之二——Tensor
- LeetCode 面试题 08.01. 三步问题 (动态规划)
- C#学习基础---BrowsableAttribute.Browsable属性
- SWFUpload控件使用
- DEDECMS之九 文章采集
- 原因是出现以下错误: 80040154 没有注册类 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
- mac推箱子c语言,c语言写的推箱子源码,非常适合新手学习
- cs6导入库闪退 flash_flash cs6源文件怎么修复,导入老跳出意外格式,我是用flash cs6做的。我还有一半没有导出 swf 呢?...
- Postman安装与简单使用
- IEEEtran Latex模板五作者排版问题
- 双十一不孤单,再过几小时北欧人民也和你一样开始抢单
- 与传统计算相比,云计算具有哪些优势?
- 大点干!早点散----------深入剖析GFS分布式文件系统
热门文章
- Go 学习笔记(64)— Go error.New 创建接口错误对象、fmt.Errorf 创建接口错误对象、errors.Is 和 errors.As
- c语言中字符串数组的地址存放以及%s输出单个字符导致程序崩溃的问题
- Python 读取文本时的 read/readline/readlines
- Apache POI:解决数据库和Excel之间相互转换的烦恼~
- TensorFlow Frontend前端
- 将TVM集成到PyTorch上
- Ascend Pytorch算子功能验证
- 图像复原的神经网络稀疏表示
- 常用深度学习框——Caffe/TensorFlow / Keras/ PyTorch/MXNet
- 摄像头和相机模型和内参原理