append函数的使用:

append可以向一个slice中追加一个元素、多个元素、新的切片

var x []intx = append(x, 1) // 追加一个元素
x = append(x,2,3,4) //追加多个元素
x = append(x, []int{5,6,7}...) //追加一个新的切片

追加一个切片需要进行解包

append()的原理

  1. 如果原来slice capacity足够大的情况下,append()函数会创建一个新的slice,它与old slice共享底层内存

    创建原理:newSlice = oldSlice[:1+len(x)]

    用old slice给new slice进行赋值的方式进行创建,会共享内存。并返回这个new slice。

    因此为了保险,我们通常将append返回的内容赋值给原来的slice: x = appen(x,…)

  2. 如果原来的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()详解相关推荐

  1. PBFT -Golang实现详解

    PBFT -Golang实现详解 首相需要知道,PBFT算法的实现并不是听起来那么简单,我们通常听的这个算法的实现的的最为主要的,只是这种算法中的一个协议-----一致性协议. 另外还有检查点协议和视 ...

  2. golang slice 详解

    一.数组切片的使用: func main() {//1.基于数组创建数组切片var array [10]int = [10]int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}var ...

  3. golang安装详解

    1.首先安装golang的类似java的windows安装包,即sdk1.9.2.可以从这里进行下载点击我进行go安装包下载 2.然后安装集成开发环境,goland如下图所示 点击我进行goland下 ...

  4. Golang iota详解

    iota是go语言的常量计数器,只能在常量表达式中使用 iota在const关键字出现时将被重置为0,const中每新增一行常量声明将使iota计数一次 可理解为const语句块中的行索引. 1.在常 ...

  5. Golang GORM 详解

    学习目标: 1. GORM 介绍 2. GORM 使用 学习内容: 1 GORM介绍 GORM 是基于 Go 语言的 ORM 库,可使开发者对数据库使用更为方便,支持多种数据库. 它提供了许多功能,例 ...

  6. [Golang]defer详解

    数据结构 defer的数据结构定义在$GOROOT/src/runtime/runtime2.go // 大体定义如下,忽略少部分字段 type _defer struct {sp uintptr / ...

  7. Golang bufio Reader 源码详解

    Golang - bufio Reader详解 bufio 是对 gosdk 种 io.Reader 和 io.writer 的二次打包,以 []byte 作为其 buffer,在 io.Reader ...

  8. golang 解析php序列化,golang实现php里的serialize()和unserialize()序列和反序列方法详解...

    Golang 实现 PHP里的 serialize() . unserialize() 安装 go get -u github.com/techleeone/gophp/serialize 用法 pa ...

  9. Python 列表 append()函数使用详解

    「作者主页」:士别三日wyx append函数详解 1. 基本使用 2. 任意类型元素 3. 列表同步 3.1 原理剖析 3.2 解决方案 4. append()与extend()的区别 1. 基本使 ...

最新文章

  1. 2022-2028年中国露天采矿行业调查与投资前景评估报告
  2. java医疗框架,java毕业设计_springboot框架的城市智慧医疗服务系统
  3. server如何调用 thrift_Thrift入门很简单
  4. 用scikit-learn研究局部线性嵌入(LLE)
  5. 关于《编程之美》稿酬捐赠的补充说明
  6. 笔记本交还公司了,伴随了我两年的家伙。
  7. Qt Qwdget 汽车仪表知识点拆解2 图像放大
  8. 安徽省级办公室高级应用计算机二级,2019年9月安徽省计算机等级二级考试教程:二级MSOffice高级应用上机指导...
  9. Pytorch-NLU,一个中文文本分类、序列标注(实体识别、分词、词性标注)的极简工具包,基于pytorch与tramsforers
  10. 小程序调用百度api实现图像识别
  11. canal 全量数据
  12. tungsten replicator oracle,Tungsten Replicator 实验
  13. 用计算机弹九八k的乐谱,完整版儿童歌曲简谱大全.docx
  14. 复现ICCV 2017经典论文—PyraNet
  15. 渗透测试技巧总结更新篇2
  16. Python爬虫爬取滚动新闻
  17. synchronized锁升级那点事
  18. ODN 2006丨艾美捷CpG ODN系列说明书
  19. 单片机彩灯移动实验_51单片机键控彩灯实验
  20. 用Python+OpenCV+PyQt开发的答题卡识别软件

热门文章

  1. WebService(腾讯QQ在线状态 WEB 服务)
  2. 华为交换机配置常用命令
  3. python足球大数据分析_使用Python抓取欧洲足球联赛数据进行大数据分析
  4. 【MySQL】MySQL的IFNULL()、ISNULL()、NULLIF()函数用法说明
  5. java web 统计在线用户_Javaweb监听器实例之统计在线人数
  6. 微软的黑屏说明了什么?
  7. zbb20171223 vm12 Vmware虚拟机设置静态IP地址
  8. 四书《孟子》《论语》《中庸》《大学》五经《风》《雅》《颂》全文
  9. 软件设计师考试(2018下半年)
  10. 三年前找工作的我,希望给正在求职的你一些启发