Go基础编程:复合类型—切片slice
1. 概述
数组的长度在定义之后无法再次修改;数组是值类型,每次传递都将产生一份副本。显然这种数据结构无法完全满足开发者的真实需求。Go语言提供了数组切片(slice)来弥补数组的不足。
切片并不是数组或数组指针,它通过内部指针和相关属性引⽤数组⽚段,以实现变⻓⽅案。
slice并不是真正意义上的动态数组,而是一个引用类型。slice总是指向一个底层array,slice的声明也可以像array一样,只是不需要长度。
2. 切片的创建
slice和数组的区别:声明数组时,方括号内写明了数组的长度或使用…自动计算长度,而声明slice时,方括号内没有任何字符。
var s1 []int //声明切片和声明array一样,只是少了长度,此为空(nil)切片s2 := []int{}//make([]T, length, capacity) //capacity可以省略,则和length的值相同var s3 []int = make([]int, 0)s4 := make([]int, 0, 0)s5 := []int{1, 2, 3} //创建切片并初始化
3. 切片的操作
3.1 切片截取
操作 | 含义 |
---|---|
s[n] | 切片s中索引位置为n的项 |
s[:] | 从切片s的索引位置0到len(s)-1处所获得的切片 |
s[low:] | 从切片s的索引位置low到len(s)-1处所获得的切片 |
s[:high] | 从切片s的索引位置0到high处所获得的切片,len=high |
s[low:high] | 从切片s的索引位置low到high处所获得的切片,len=high-low |
s[low:high:max] | 从切片s的索引位置low到high处所获得的切片,len=high-low,cap=max-low |
len(s) | 切片s的长度,总是<=casp(s) |
cap(s) | 切片s的容量,总是>=len(s) |
示例说明:
array := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}
操作 | 结果 | len | cap | 说明 |
---|---|---|---|---|
array[:6:8] | [0 1 2 3 4 5] | 6 | 8 | 省略 low |
array[5:] | [5 6 7 8 9] | 5 | 5 | 省略 high、 max |
array[:3] | [0 1 2] | 3 | 10 | 省略 high、 max |
array[:] | [0 1 2 3 4 5 6 7 8 9] | 10 | 10 | 全部省略 |
3.2 切片和底层数组关系
s := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}s1 := s[2:5] //[2 3 4]s1[2] = 100 //修改切片某个元素改变底层数组fmt.Println(s1, s) //[2 3 100] [0 1 2 3 100 5 6 7 8 9]s2 := s1[2:6] // 新切片依旧指向原底层数组 [100 5 6 7]s2[3] = 200fmt.Println(s2) //[100 5 6 200]fmt.Println(s) //[0 1 2 3 100 5 6 200 8 9]
3.3 内建函数
3.3.1 append
append函数向 slice 尾部添加数据,返回新的 slice 对象:
var s1 []int //创建nil切换//s1 := make([]int, 0)s1 = append(s1, 1) //追加1个元素s1 = append(s1, 2, 3) //追加2个元素s1 = append(s1, 4, 5, 6) //追加3个元素fmt.Println(s1) //[1 2 3 4 5 6]s2 := make([]int, 5)s2 = append(s2, 6)fmt.Println(s2) //[0 0 0 0 0 6]s3 := []int{1, 2, 3}s3 = append(s3, 4, 5)fmt.Println(s3)//[1 2 3 4 5]
append函数会智能地底层数组的容量增长,一旦超过原底层数组容量,通常以2倍容量重新分配底层数组,并复制原来的数据:
func main() {s := make([]int, 0, 1)c := cap(s)for i := 0; i < 50; i++ {s = append(s, i)if n := cap(s); n > c {fmt.Printf("cap: %d -> %d\n", c, n)c = n}}/*cap: 1 -> 2cap: 2 -> 4cap: 4 -> 8cap: 8 -> 16cap: 16 -> 32cap: 32 -> 64*/
}
3.3.2 copy
函数 copy 在两个 slice 间复制数据,复制⻓度以 len 小的为准,两个 slice 可指向同⼀底层数组。
data := [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}s1 := data[8:] //{8, 9}s2 := data[:5] //{0, 1, 2, 3, 4}copy(s2, s1) // dst:s2, src:s1fmt.Println(s2) //[8 9 2 3 4]fmt.Println(data) //[8 9 2 3 4 5 6 7 8 9]
4. 切片做函数参数
func test(s []int) { //切片做函数参数s[0] = -1fmt.Println("test : ")for i, v := range s {fmt.Printf("s[%d]=%d, ", i, v)//s[0]=-1, s[1]=1, s[2]=2, s[3]=3, s[4]=4, s[5]=5, s[6]=6, s[7]=7, s[8]=8, s[9]=9,}fmt.Println("\n")
}func main() {slice := []int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}test(slice)fmt.Println("main : ")for i, v := range slice {fmt.Printf("slice[%d]=%d, ", i, v)//slice[0]=-1, slice[1]=1, slice[2]=2, slice[3]=3, slice[4]=4, slice[5]=5, slice[6]=6, slice[7]=7, slice[8]=8, slice[9]=9,}fmt.Println("\n")
}
Go基础编程:复合类型—切片slice相关推荐
- 10.Go复合类型-切片
10.Go复合类型-切片 前言 在上一章节,我们已经学习了 Go符合类型 - 数组,本章节我们来看看 切片. 2:切片 2.1 切片(slice)概念 在讲解切片(slice)之前,大家思考一下数组有 ...
- winform point数组带数值_带你学够浪:Go语言基础系列 - 8分钟学复合类型
对于一般的语言使用者来说 ,20% 的语言特性就能够满足 80% 的使用需求,剩下在使用中掌握.基于这一理论,Go 基础系列的文章不会刻意追求面面俱到,但该有知识点都会覆盖,目的是带你快跑赶上 Gol ...
- go语言基础数据结构学习---- 数组, 列表(list)和切片(slice)
go语言基础数据结构学习–> 数组, 列表(list)和切片(slice) go 语言中的 数组是类型相同的元素的集合, 列表是双链表的容器, 可以添加不同类型的数据切片是对现有数组的引用, 比 ...
- PTA 基础编程题目集 7-6 混合类型数据格式化输入 C语言
PTA 基础编程题目集 7-6 混合类型数据格式化输入 C语言 本题要求编写程序,顺序读入浮点数1.整数.字符.浮点数2,再按照字符.整数.浮点数1.浮点数2的顺序输出. 输入格式: 输入在一行中顺序 ...
- 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef
黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...
- python slice类型_复合类型Slice python中的list
# GO types Slice ### Author 品茶 > Slice(切片)代表变长的序列,序列中每个元素都具有相同的类型,slice类型写成[]T,T代表slice中元素的类型,sli ...
- Edgecam2016基础编程到车铣复合加工视频教程
Edgecam2016基础编程到车铣复合加工视频教程 链接:https://pan.baidu.com/s/1w1X-MzAxswh5IOZ8AsqjvA 提取码:phij
- C基础 | 【05】(内存结构以及复合类型)
文章目录 内存结构 作用域 局部变量 全局变量 静态变量 静态局部变量 静态全局变量 全局函数和静态函数 静态函数 全局函数 内存布局 内存分区 代码区(程序指令) 数据区(静态区.全局区) 栈区 堆 ...
- Golang的基本类型、引用类型、复合类型
1.基础内置类型: 包括数值类型.字符串类型.布尔类型.数组等除5种引用类型和复合类型外都是基础内置类型.当对这些类型的值进行增加或者删除的时候会创建一个新值,因此当把这些类型的值传递给方法或者函数时 ...
- Go语言中的复合类型及面向对象思想
1.结构体 struct 定义格式: type 结构体名称 struct {属性1 类型属性2 类型... } 结构体的初始化可以使用new关键词和var关键词,不同的是如果使用new,则返回类型是一 ...
最新文章
- javascript this指针详解
- 为什么阿里不允许用Executors创建线程池
- Linux的vi命令作用?
- 零垃圾创建数百万个对象
- OpenCV-数字图像处理之中值滤波
- 短小有趣的c语言代码,分享一段有趣的小代码
- NutDao配置多数据源
- ubuntu下打开matlab_ubuntu下matlab安装,添加中文支持与启动
- 【报告分享】德勤-教育行业发展报告(政策、资本、AI、职业教育).pdf2019年中国外卖产业调查研究报告.pdf...
- 北斗芯片是如何决定着北斗产业的未来?
- 程序员一周内了解一个行业的方法
- ICASSP 2022 语音合成和语音识别简报
- iis 6.0部署asp网站
- Cat.1、Cat.4、4G之间的区别
- 网站SEO优化之图片优化方法
- matlab如何弄上标,[转载]在Matlab中怎样输入特殊符号或者上标、下标
- GoldenGate添加进程及初始化
- jQuery 遍历 - 后代 【后代是子、孙、曾孙等等。children()查找下一个子元素; find()查找所有后代】
- 杰理之一拖八烧录器烧写外挂flash说明【篇】
- 2020.01.12日常总结
热门文章
- mysql_ddl(库、表、数据类型、常见约束)
- Advanced Graphics and Animations for iOS Apps
- SSM中 web.xml配置文件
- 在IDEA中编辑struts国际化properties文件
- 车聘网框架及源码介绍
- [原]减小VC6编译生成的exe文件的大小
- url中文传参乱码问题
- Ext学习笔记01 - NameSpace,类实例属性,类实例方法,类静态方法
- ubuntu下txt文件中文显示乱码的方法【转载】
- NickLee.FortuneBase(2010.1_B) For Oracle92i/10g/11g