Golang Append()详解
append函数的使用:
append可以向一个slice中追加一个元素、多个元素、新的切片
var x []intx = append(x, 1) // 追加一个元素
x = append(x,2,3,4) //追加多个元素
x = append(x, []int{5,6,7}...) //追加一个新的切片
追加一个切片需要进行解包
append()的原理
如果原来slice capacity足够大的情况下,append()函数会创建一个新的slice,它与old slice共享底层内存
创建原理:
newSlice = oldSlice[:1+len(x)]
用old slice给new slice进行赋值的方式进行创建,会共享内存。并返回这个new slice。
因此为了保险,我们通常将append返回的内容赋值给原来的slice: x = appen(x,…)
如果原来的slice没有足够的容量添加内容,则创建一个新的slice,这个slice是copy的old slice。不与old slice共享内存
实例:appendInt()
这个是只能追加一个元素的例子
追加之前,判断cap(x) 是否足够,
- 如果足够则创建的z 大小是 len(x) + 1
- 如果不够,则创建一个是原来两倍大的z
func appendInt(x []int, y int) []int {var z []int // 创建一个中间数组zlen := len(x) + 1 // 准备增加一个元素的位子// 判断 x 的cap是否足够容纳新的元素if zlen <= cap(x) {// 容量足够,直接将x拷贝给yz = x[:zlen]//如果容量足够要装一个z,比x大一个位子,因此要把x后面的空位也拷贝过去} else {// x 的容量不够 需要扩容zcap := zlen // 如果xlen == 0if zcap < 2*len(x) {zcap = 2 * len(x) //创建为原来的两倍}z = make([]int, zlen, zcap)copy(z, x)}z[len(x)] = y // 将y放在最后一个位子return z
}
测试:
func main() {var x, y []intfor i := 0; i < 10; i++ {y = appendInt(x, i)fmt.Printf("%d cap=%d\t%v\n", i, cap(y), y)x = y}
}
每次容量的变化:
0 cap=1 [0]
1 cap=2 [0 1]
2 cap=4 [0 1 2]
3 cap=4 [0 1 2 3]
4 cap=8 [0 1 2 3 4]
5 cap=8 [0 1 2 3 4 5]
6 cap=8 [0 1 2 3 4 5 6]
7 cap=8 [0 1 2 3 4 5 6 7]
8 cap=16 [0 1 2 3 4 5 6 7 8]
9 cap=16 [0 1 2 3 4 5 6 7 8 9]
拷贝:赋值 copy区别
=
赋值拷贝,会将原来slice的地址拷贝,新旧slice共享内存。
copy(new, old)
函数copy只会将slice内容进行拷贝。
var x, y []intx = []int{1, 2, 3, 4}fmt.Println(x, y) // [1 2 3 4] []y = xy[0] = 0fmt.Println("y 改后 : ", x, y) //[0 2 3 4] [0 2 3 4]
Golang Append()详解相关推荐
- PBFT -Golang实现详解
PBFT -Golang实现详解 首相需要知道,PBFT算法的实现并不是听起来那么简单,我们通常听的这个算法的实现的的最为主要的,只是这种算法中的一个协议-----一致性协议. 另外还有检查点协议和视 ...
- golang slice 详解
一.数组切片的使用: func main() {//1.基于数组创建数组切片var array [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}var ...
- golang安装详解
1.首先安装golang的类似java的windows安装包,即sdk1.9.2.可以从这里进行下载点击我进行go安装包下载 2.然后安装集成开发环境,goland如下图所示 点击我进行goland下 ...
- Golang iota详解
iota是go语言的常量计数器,只能在常量表达式中使用 iota在const关键字出现时将被重置为0,const中每新增一行常量声明将使iota计数一次 可理解为const语句块中的行索引. 1.在常 ...
- Golang GORM 详解
学习目标: 1. GORM 介绍 2. GORM 使用 学习内容: 1 GORM介绍 GORM 是基于 Go 语言的 ORM 库,可使开发者对数据库使用更为方便,支持多种数据库. 它提供了许多功能,例 ...
- [Golang]defer详解
数据结构 defer的数据结构定义在$GOROOT/src/runtime/runtime2.go // 大体定义如下,忽略少部分字段 type _defer struct {sp uintptr / ...
- Golang bufio Reader 源码详解
Golang - bufio Reader详解 bufio 是对 gosdk 种 io.Reader 和 io.writer 的二次打包,以 []byte 作为其 buffer,在 io.Reader ...
- golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...
Golang 实现 PHP里的 serialize() . unserialize() 安装 go get -u github.com/techleeone/gophp/serialize 用法 pa ...
- Python 列表 append()函数使用详解
「作者主页」:士别三日wyx append函数详解 1. 基本使用 2. 任意类型元素 3. 列表同步 3.1 原理剖析 3.2 解决方案 4. append()与extend()的区别 1. 基本使 ...
最新文章
- 2022-2028年中国露天采矿行业调查与投资前景评估报告
- java医疗框架,java毕业设计_springboot框架的城市智慧医疗服务系统
- server如何调用 thrift_Thrift入门很简单
- 用scikit-learn研究局部线性嵌入(LLE)
- 关于《编程之美》稿酬捐赠的补充说明
- 笔记本交还公司了,伴随了我两年的家伙。
- Qt Qwdget 汽车仪表知识点拆解2 图像放大
- 安徽省级办公室高级应用计算机二级,2019年9月安徽省计算机等级二级考试教程:二级MSOffice高级应用上机指导...
- Pytorch-NLU,一个中文文本分类、序列标注(实体识别、分词、词性标注)的极简工具包,基于pytorch与tramsforers
- 小程序调用百度api实现图像识别
- canal 全量数据
- tungsten replicator oracle,Tungsten Replicator 实验
- 用计算机弹九八k的乐谱,完整版儿童歌曲简谱大全.docx
- 复现ICCV 2017经典论文—PyraNet
- 渗透测试技巧总结更新篇2
- Python爬虫爬取滚动新闻
- synchronized锁升级那点事
- ODN 2006丨艾美捷CpG ODN系列说明书
- 单片机彩灯移动实验_51单片机键控彩灯实验
- 用Python+OpenCV+PyQt开发的答题卡识别软件
热门文章
- WebService(腾讯QQ在线状态 WEB 服务)
- 华为交换机配置常用命令
- python足球大数据分析_使用Python抓取欧洲足球联赛数据进行大数据分析
- 【MySQL】MySQL的IFNULL()、ISNULL()、NULLIF()函数用法说明
- java web 统计在线用户_Javaweb监听器实例之统计在线人数
- 微软的黑屏说明了什么?
- zbb20171223 vm12 Vmware虚拟机设置静态IP地址
- 四书《孟子》《论语》《中庸》《大学》五经《风》《雅》《颂》全文
- 软件设计师考试(2018下半年)
- 三年前找工作的我,希望给正在求职的你一些启发