Golang中进行reslice时的注意事项
先看下面代码:
package main import "fmt" func main() {
slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
fmt.Println(slice, len(slice), cap(slice)) //[0 1 2 3 4 5 6 7 8] 9 9
newSlice := slice[6:8]
fmt.Println(newSlice, len(newSlice), cap(newSlice)) //[6 7] 2 3 //向newSlice中添加一个元素,注意此时,刚好len(newSlice) == cap(newSlice)
newSlice = append(newSlice, 111)
fmt.Println(slice, len(slice), cap(slice)) //[0 1 2 3 4 5 6 7 111] 9 9
fmt.Println(newSlice, len(newSlice), cap(newSlice)) //[6 7 111] 3 3 //再向newSlice中添加一个元素,注意此时,
//刚好向后扩展newSlice时,已经超过了原slice的cap,超过的部分,不会反映到原slice
newSlice = append(newSlice, 222)
fmt.Println(slice, len(slice), cap(slice)) //[0 1 2 3 4 5 6 7 111] 9 9
fmt.Println(newSlice, len(newSlice), cap(newSlice)) //[6 7 111 222] 4 6
}
然后再看这么一个代码:
package main import "fmt" func main() {
slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8}
fmt.Println(slice, len(slice), cap(slice)) //[0 1 2 3 4 5 6 7 8] 9 9
newSlice := slice[6:8]
fmt.Println(newSlice, len(newSlice), cap(newSlice)) //[6 7] 2 3 //向newSlice中添加两个元素,注意此时,newSlice的len会变成4,超过了他的cap(3)
//所以会在底层新创建一个数组来保存,所以,对newSlice的操作不会反映到原slice
newSlice = append(newSlice, 111, 222)
fmt.Println(slice, len(slice), cap(slice)) //[0 1 2 3 4 5 6 7 8] 9 9
fmt.Println(newSlice, len(newSlice), cap(newSlice)) //[6 7 111 222] 4 6
}
综上所述:当我们调用append向一个新的slice添加元素时:
如果新的slice在append之后,新slice的cap没有改变(即新slice的len仍小于新slice的cap),那么,至少在cap改变之前,append的行为结果都会反映到原slice
如果新的slice在append之后,新slice的cap改变了,那么,新的slice就拥有了自己的底层数组,所以,append的行为结果不会反映到原slice,但是cap没有改变之前,仍会反映到原slice,只是在cap改变的之后,才不会反映到slice
Golang中进行reslice时的注意事项的更多相关文章
- 直接添加viewController中的view时的注意事项
直接添加viewController中的view时需要注意一个问题,比如: MyTestViewController *vc = [MyTestViewController new]; [self.v ...
- 关于开发中使用writeToFile时的注意事项
总会有一些坑在前面等着你 我们先来看一下后台返回的部分json数据,稍后再来分析问题,仔细看一下userId和userCode两个字段,其他不用看 "list": [{ " ...
- 在构造函数中使用new时的注意事项
果然,光看书是没用的,一编程序,很多问题就出现了-- 注意事项: 1. 如果构造函数中适用了new初始化指针成员,则构析函数中必须要用delete 2. new与delete必须兼容,new对应del ...
- 修改NSMutableArray中的元素时的注意事项
最近做项目遇到从文件加载数组,并对数组中的元素进行操作的问题,特意写了个Demo,记录下要注意的东西: 代码如下: NSArray *array = @["]; NSMutableArray ...
- golang中copy文件时,buffer设多大值合适,性能对比
在go语言中,copy文件时,大文件使用buffer缓冲,可以明显加快时间, 但这个值多大合适呢? 除了考虑计算机的硬件资源,还要考虑CP文件的大小. 如果都是100m之内的小文件,一次CP完就可以. ...
- mysql中使用正则表达式时的注意事项
mysql不支持\d元字符匹配数字 mysql不支持向前.向后查找 regexp不能和not搭配使用
- DLL中使用字符串时的注意事项。
library dll1; uses SysUtils, Classes; {$R *.res} function TESTDLL:string;stdcall; begin Result:='tes ...
- MYSQL表中设置字段类型为TIMESTAMP时的注意事项
在MYSQL中,TIMESTAMP类型是用来表示日期的,但是和DATETIME不同,不同点就不再这里说明了. 当我们在使用TIMESTAMP类型设置表中的字段时,我们应该要注意一点,首先我们在表中新增 ...
- solr与.net系列课程(八)solr中重跑索引的注意事项
solr与.net系列课程(八)solr中重跑索引的注意事项 我们如果在项目中使用solr,那肯定就是把数据库中的数据跑进solr服务器中,solr有两种操作一种是新建索引,一种是增量索引,这里我们来 ...
随机推荐
- 安装Window 10系统------计算机经验
为什么这次安装window10系统呢?不是和window7系统的安装方法一样么?如果你是这样的想的话,是不完全对的,因为window10系统的安装有些繁杂,需要耐心.下面我就准备了官方原版的windo ...
- python黑帽子
1.TCP客户端 #AF_INET 使用标准的IPv4地址或者主机名 #SOCK_STREAM是一个客户端 import socket target_host = 'www.google.com' t ...
- LeetCode算法题-Guess Number Higher or Lower(Java实现)
这是悦乐书的第211次更新,第224篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第79题(顺位题号是374).我们正在玩数字游戏. 游戏如下:我从1到n中选择一个数字. ...
- LeetCode算法题-Intersection of Two Arrays II(Java实现)
这是悦乐书的第208次更新,第220篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第76题(顺位题号是350).给定两个数组,编写一个函数来计算它们的交集.例如: 输入: ...
- Vue修改、编辑时,撤销修改内容,表格内容不变
在编辑该行的过程中,突然不想编辑了,想点击撤销按钮,将该行数据恢复到旧值,目前的做法是,在点击编辑按钮的时候转换成json字符,点击撤销按钮的时候再解析成对象,赋值给该行的数据. // 编辑editH ...
- Scrapy 框架 总结
总结: 1.中间件:下载中间件(拦截请求和响应) - process_request: - prceess_response: - process_exception: - 请求: - UA伪装: - ...
- 5.03-requests_ssl
import requests url = 'https://www.12306.cn/mormhweb/' headers = { 'User-Agent': 'Mozilla/5.0 (Macin ...
- php文件管理,能够点击依照时间,大小,名称排序
php文件管理.能够点击依照时间.大小,名称排序 本例没实用到jquery 演示 PHP Code <?php $rootdir="./"; $spacen ...
- centos7下kubernetes(6。运行应用)
Deployment 从一个例子开始 kubectl run nginx-deployment --image=nginx:1.7.9 --replicas=2 kubectl get deploym ...
- L2-012 关于堆的判断 (25 分)
就是一个最小根堆. 最小根堆的性质,根节点小于等于子树的完全二叉树吧. 构建最小根堆的过程就是一个自下向上的过程. #include<iostream> #include<strin ...