最新要闻
- 神舟十六号30日9时31分发射:三名航天员名单公布 首次有大学教授
- 华为畅享60X根治续航焦虑!充电宝完全派不上用场了
- 全球微资讯!华为智选车终于出轿车 奇瑞EH3谍照曝光:华为ADS摄像头瞩目
- 世界今热点:小屏4K“天花板”优派推出新款23.8英寸显示器 1999元
- 神十六乘组公布:载荷专家将首登天宫-动态
- 搜狐汽车全球快讯 | 比亚迪或考虑在法国建厂 比亚迪:正评估建厂可行性-全球资讯
- 618开车神价 爱国者4TB PCIe 4.0硬盘999元(国产长寿TLC闪存)-全球今亮点
- 特斯拉、丰田、BBA等都靠边!离开中国:世界无法生产电动车电池 当前观点
- 苹果iPhone销冠地位稳如泰山 今年618攻略请收好
- 热消息:央视网评《家有儿女》疑似被恶意评分:小心网络评分变“粉黑大战”
- 山东舰穿越台湾海峡北上,台军兵推双航母“攻台”_今日热讯
- 天天快消息!内存频率、容量继续狂飙 科赋宣布DDR5-8600:单条48GB
- 环球今亮点!史上最大屏!iPhone 16 Pro系列确认6.3/6.9英寸屏幕
- LCD党福音!Redmi Note 12T Pro跑分出炉:搭载天玑8200-Ultra
- 每日资讯:101岁杨振宁在西湖大学致辞 给自己打分还不错 张朝阳赞其超越霍金
- 网络授课用什么软件好 网络授课用什么软件
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
今日视点:关于切片参数传递的问题
(资料图片仅供参考)
前言:在 Golang 中函数之间传递变量时总是以值的方式传递的,无论是 int,string,bool,array 这样的内置类型(或者说原始的类型),还是 slice,channel,map 这样的引用类型,在函数间传递变量时,都是以值的方式传递,也就是说传递的都是值的副本。
在使用ioutil的ReadAll方法时查看了其内部实现如下,这让我很痛苦,不明白为什么要这样写。下面我们就来一探究竟。
func ReadAll(r Reader) ([]byte, error) { b := make([]byte, 0, 512) for { if len(b) == cap(b) { // Add more capacity (let append pick how much). b = append(b, 0)[:len(b)] } n, err := r.Read(b[len(b):cap(b)]) b = b[:len(b)+n] if err != nil { if err == EOF { err = nil } return b, err } }}
讨论这个问题之前先看一下标准库中切片的内部结构
type SliceHeader struct { Data uintptr Len int Cap int}
由切片的结构定义可知,切片的结构由三个信息组成:
- 指针Data,指向底层数组中切片指定的开始位置
- 长度Len,即切片的长度
- 容量Cap,也就是最大长度,即切片开始位置到数组的最后位置的长度
最开始我想将一个文件内容读取到内存,我想到的操作是这样的
func f1() { f, _ := os.Open("F:\\hello.txt") b := make([]byte, 0, 512) read, err := f.Read(b) if err != nil { return } fmt.Println(read)//打印0 fmt.Println(b)//打印[]}
为什么会出现这种情况呢?我们点开f.Read方法看到 Read reads up to len(b) bytes from the File.
读取len(b) 长度byte的数据到b,那现在len(b)=0就一个字节都不会读取了。这时候你就会明白为什么上面标准库中ReadAll参数为什么要用b[len(b):cap(b)]
(对切片的任何操作都会复制一个切片b[len(b):cap(b)]
操作对b切片结构体进行了复制,产生了新的切片并且新切片的len=cap=512,这也就解释了为什么数据能读入b[len(b):cap(b)]
了)。观察下面代码:
func f2() { f, _ := os.Open("F:\\hello.txt") b := make([]byte, 0, 512) // c := b[len(b):cap(b)] fmt.Println(len(c))//512 fmt.Println(cap(c))//512 read, err := f.Read(c) if err != nil { return } fmt.Println(read)//512 fmt.Println(b)//[] fmt.Println(b[:cap(b)])//[...] 打印出了数据 fmt.Println(c)//[...]打印出了和上面相同的数据}
这就奇怪了不是说是引用传递吗,为什么现在c作为参数传进Read方法后值被改变了。这就需要看切片的内部结构了,切片本身并不承载数据。它只是一个有三个属性的结构体,传递时,就会把这个结构体的三个属性复制一份进行传递,而且复制后头指针指向相同的地址。另外还有一个重要的概念:对切片的任何操作都会复制一个切片(并不是复制切片数据,二十切片的结构体,他们指向的内存区域还是一样的),也就是复制上面说的三个属性。读取切片类型数据的另一个重要属性就是len,len是多少那就会读多少数据,虽然由b衍生出的其他结构体他们的头指针的地址是一样的,后面的数据也是一样的,但是如果你的len是0那头指针后面的数据一个byte也不属于你,也就读不出来,你有多少的len那么头指针后就有多少数据属于你。
这也就解释了为什么b始终是空的了,虽然你的头指针后面有数据被填充了,但是你的len始终是0那么数据都与你无关也是就是空了。c切片的头指针与b相同但是len和cap不同都是512。所以就能读取出头指针后512bytes的数据了。
另外还要讨论切片的扩容机制,当切片的len=cap时使用append方法会触发内置的扩容机制cap会扩大。我就有些疑问为什么是b = append(b, 0)[:len(b)]
,因为使用append函数仅仅是为了触发扩容,添加进去的0是无意义的,原来len=512现在就变成了513,再往后填充数据就会导致与原数据不一致的问题,因此要把添加的byte去除。
func f3() { f, _ := os.Open("F:\\hello.txt") b := make([]byte, 0, 512) for { if len(b) == cap(b) { // Add more capacity (let append pick how much). //b = append(b, 0)[:len(b)] b = append(b, 0) } n, err := f.Read(b[len(b):cap(b)]) b = b[:len(b)+n] if err != nil { if err == io.EOF { err = nil } break } } fmt.Println(string(b))}
可以看到使用b = append(b, 0)
会导致部分数据失真。
关键词:
今日视点:关于切片参数传递的问题
天天视点!十大券商看后市:A股底部特征浮现 市场进一步下行空间较小
神舟十六号30日9时31分发射:三名航天员名单公布 首次有大学教授
华为畅享60X根治续航焦虑!充电宝完全派不上用场了
全球微资讯!华为智选车终于出轿车 奇瑞EH3谍照曝光:华为ADS摄像头瞩目
世界今热点:小屏4K“天花板”优派推出新款23.8英寸显示器 1999元
神十六乘组公布:载荷专家将首登天宫-动态
搜狐汽车全球快讯 | 比亚迪或考虑在法国建厂 比亚迪:正评估建厂可行性-全球资讯
【独家】Linux工作原理2常用基本命令和目录层次结构
618开车神价 爱国者4TB PCIe 4.0硬盘999元(国产长寿TLC闪存)-全球今亮点
特斯拉、丰田、BBA等都靠边!离开中国:世界无法生产电动车电池 当前观点
苹果iPhone销冠地位稳如泰山 今年618攻略请收好
热消息:央视网评《家有儿女》疑似被恶意评分:小心网络评分变“粉黑大战”
山东舰穿越台湾海峡北上,台军兵推双航母“攻台”_今日热讯
【读财报】三年期互联网主题基金透视:天弘基金业绩垫底 长盛基金风格较激进
天天快消息!内存频率、容量继续狂飙 科赋宣布DDR5-8600:单条48GB
环球今亮点!史上最大屏!iPhone 16 Pro系列确认6.3/6.9英寸屏幕
LCD党福音!Redmi Note 12T Pro跑分出炉:搭载天玑8200-Ultra
每日资讯:101岁杨振宁在西湖大学致辞 给自己打分还不错 张朝阳赞其超越霍金
网络授课用什么软件好 网络授课用什么软件
【世界独家】读数据压缩入门笔记01_数据压缩导读
苹果iOS 17超前瞻 近年来最没存在感的一代?
印度官员为找手机抽掉水库210万升水!最后工作没了|当前时讯
天天热议:iPhone 15即将量产 富士康重金招人:每人3500元奖金
焦点热议:百元股上新 双元科技申购
CISCN_Dozer战队wp
环球新资讯:AutoCAD所有版本总结、序列号密钥总结大全(转载)
ZooKeeper论文阅读笔记 焦点关注
滚筒洗衣机真的比波轮的更好吗?一文读懂
死亡风险直降12%!爱发朋友圈 竟然更长寿 环球观焦点
猫咪为什么要花那么多时间梳理毛发?只是臭美吗?_速看
世界短讯!我父亲配享太庙是谁的台词
重庆长城宽带价格表_重庆长城宽带
银行汇票的付款人是谁_银行本票的有效期限为1个月 而其提示付款期限为自出票日起最长不
王老吉百家姓氏罐大促:12罐到手价29.9元
祭祀的拼音_祭祀怎么读
Oracle 死锁与慢查询总结
当前关注:天津聚力产业链优势打造信创产业基地
全球今头条!丫丫启程回京:将返回北京动物园
当前热议!Unity的Undo:详解解析与实用案例
「学习笔记」(扩展)中国剩余定理
2023-05-28:为什么Redis单线程模型效率也能那么高?|通讯
9)子查询
女模特为长高做手术“打断”腿两次:163变180 如踩高跷
网购虾条居然收到了差评返现卡:主打的就是真诚_热点
热头条丨女生一条微信状态让初中班主任找到:他像太阳一样照耀着大家
资讯推荐:猫眼端午档观众最想看的电影!《消失的她》即将上映:倪妮主演
当前热门:世乒赛战报:陈梦/王艺迪、王楚钦/樊振东夺冠,中国包揽5冠
Doris(三) -- 索引_世界快看点
梅西、迪玛利亚领衔!阿根廷国家队中国行名单公布|关注
南京玄武湖隧道内一辆宝马5系突发自燃 浓烟蔓延数百米_时快讯
哦?上一轮G7塔图姆刚刚刷新历史记录轰了51分! 天天新视野
6年了!iPhone 15无线充电迎来升级:支持Qi2标准 速讯
安卓性能最强旗舰!iQOO Neo8 Pro下周开卖:3099元起 新要闻
马云励志人生正能量八句话_马云的八句经典语录
天天关注:系统设计:从零用户扩展到百万用户
观热点:想买洗地机的用户必看:一文让你读懂洗地机
小米Civi 3上16+1TB大存储!雷军:中端机这么猛|环球简讯
《家有儿女》疑似被恶意打分:网络评分还可信吗?
“靠天吃饭”的水电如何“旱涝保收”?清洁能源助力迎峰度夏
大模型全情投入,低代码也越来越清晰
游泳时 千万不要穿白色和蓝色的泳衣 真的很危险! 世界播报
自营牧场:辉山纯牛奶7.6元/L大促 速囤-当前头条
C919飞机上有五福临门主题餐:内含上海特产大白兔牛奶
腾讯又一手游没了!《街头篮球》国服宣布7月停服
子午觉是睡眠养生之法 子午觉其中的子时和午时分别指的是-全球微速讯
世界观点:时隔6年姗姗来迟!《极限竞速》新作封面图终于公布
格局打开!波音官方庆祝C919首航成功
结转销售成本会计分录怎么写_结转销售成本会计分录
抱紧华为大腿一年 赛力斯挤进新势力前三:但还未跨过生死线|天天新要闻
世界今日报丨《西游ABC》IGN 8分:吴彦祖演技精湛 神话故事迷人
10万级大五座纯电轿车 宝骏云朵信息公开:无模组电池放心跑_全球热消息
深入分析:近端梯度下降法、交替方向乘子法、牛顿法
快看点丨30年老律师用ChatGPT旁征博引:结果被骗得禁止执业!
WinXP问世22年后 黑客发布离线激活算号器:强大程度被低估了
见证历史!国产大飞机C919首航顺利降落
西藏拉萨:藏式克朗球协会正式成立
MAC中文版 Final Cut Pro X(FCPX) V10.6.6 专属视频剪辑后期工具安装教程_全球快看
微软宣布Windows全球用户超10亿!Win11是史上最可靠操作系统 快看
特斯拉陶琳:谣言层出不穷、原因之一是流量至上
中国经济信心说丨人口高质量发展 从直面每个家庭的实际困难开始
环球微动态丨Python 标准类库-因特网数据处理之Base64数据编码
世界微资讯!2023 Sun Simiao TCM International Forum kicks off in China's Shaanxi
注意防范 7省市将现大到暴雨:部分地区有雷暴大风或冰雹-环球关注
快资讯丨直播:国产大飞机C919商业首飞!网友感叹中国人终于要坐上国产大飞机
时隔10年 索尼全新PS掌机Q公布!电池续航很堪忧
青海省内外贸易实现快速增长_新动态
一代网民青春记忆 天涯回应无法访问:拖欠多年电信IDC费已无法协商
周鸿祎训练数字人代替演讲!直言有危机感 不想被数字人“干掉”
全球视讯!《小美人鱼》北美票房第一
树莓派使用HC-SR04超声波测距-环球快播报
省社保中心一行调研株洲经开区社保系统数据迁移工作
余承东:没水平的人才打价格战 靠低价的车企很难走远
环球快讯:一理想车主雨天高速路躺平开车:用饮料瓶欺骗汽车“自动驾驶”
世界观焦点:济南工程职业技术学院举办山东省2023年度第一场“课程思政研课会”
世界快资讯丨印度一官员为找手机抽空210万升水库:最终结果神仙难救
余承东:我喜欢做产品、不喜欢吹牛打广告 焦点简讯
期待!国产大飞机C919商业航班今天首飞 全球热门
高考倒计时10天!今年新增21种普通本科新专业:考生报志愿注意|速讯
学系统集成项目管理工程师(中项)系列28_后记|快资讯