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相关推荐

  1. 10.Go复合类型-切片

    10.Go复合类型-切片 前言 在上一章节,我们已经学习了 Go符合类型 - 数组,本章节我们来看看 切片. 2:切片 2.1 切片(slice)概念 在讲解切片(slice)之前,大家思考一下数组有 ...

  2. winform point数组带数值_带你学够浪:Go语言基础系列 - 8分钟学复合类型

    对于一般的语言使用者来说 ,20% 的语言特性就能够满足 80% 的使用需求,剩下在使用中掌握.基于这一理论,Go 基础系列的文章不会刻意追求面面俱到,但该有知识点都会覆盖,目的是带你快跑赶上 Gol ...

  3. go语言基础数据结构学习---- 数组, 列表(list)和切片(slice)

    go语言基础数据结构学习–> 数组, 列表(list)和切片(slice) go 语言中的 数组是类型相同的元素的集合, 列表是双链表的容器, 可以添加不同类型的数据切片是对现有数组的引用, 比 ...

  4. PTA 基础编程题目集 7-6 混合类型数据格式化输入 C语言

    PTA 基础编程题目集 7-6 混合类型数据格式化输入 C语言 本题要求编写程序,顺序读入浮点数1.整数.字符.浮点数2,再按照字符.整数.浮点数1.浮点数2的顺序输出. 输入格式: 输入在一行中顺序 ...

  5. 黑马程序员C语言基础(第八天)复合类型(自定义类型)(结构体)、共用体(联合体)、枚举enum、 typedef

    黑马程序员C语言基础(第一天) 黑马程序员C语言基础(第二天) 黑马程序员C语言基础(第三天) 黑马程序员C语言基础(第四天)数据类型 黑马程序员C语言基础(第五天)运算符与表达式.程序流程结构.数组 ...

  6. python slice类型_复合类型Slice python中的list

    # GO types Slice ### Author 品茶 > Slice(切片)代表变长的序列,序列中每个元素都具有相同的类型,slice类型写成[]T,T代表slice中元素的类型,sli ...

  7. Edgecam2016基础编程到车铣复合加工视频教程

    Edgecam2016基础编程到车铣复合加工视频教程 链接:https://pan.baidu.com/s/1w1X-MzAxswh5IOZ8AsqjvA  提取码:phij 

  8. C基础 | 【05】(内存结构以及复合类型)

    文章目录 内存结构 作用域 局部变量 全局变量 静态变量 静态局部变量 静态全局变量 全局函数和静态函数 静态函数 全局函数 内存布局 内存分区 代码区(程序指令) 数据区(静态区.全局区) 栈区 堆 ...

  9. Golang的基本类型、引用类型、复合类型

    1.基础内置类型: 包括数值类型.字符串类型.布尔类型.数组等除5种引用类型和复合类型外都是基础内置类型.当对这些类型的值进行增加或者删除的时候会创建一个新值,因此当把这些类型的值传递给方法或者函数时 ...

  10. Go语言中的复合类型及面向对象思想

    1.结构体 struct 定义格式: type 结构体名称 struct {属性1 类型属性2 类型... } 结构体的初始化可以使用new关键词和var关键词,不同的是如果使用new,则返回类型是一 ...

最新文章

  1. javascript this指针详解
  2. 为什么阿里不允许用Executors创建线程池
  3. Linux的vi命令作用?
  4. 零垃圾创建数百万个对象
  5. OpenCV-数字图像处理之中值滤波
  6. 短小有趣的c语言代码,分享一段有趣的小代码
  7. NutDao配置多数据源
  8. ubuntu下打开matlab_ubuntu下matlab安装,添加中文支持与启动
  9. 【报告分享】德勤-教育行业发展报告(政策、资本、AI、职业教育).pdf2019年中国外卖产业调查研究报告.pdf...
  10. 北斗芯片是如何决定着北斗产业的未来?
  11. 程序员一周内了解一个行业的方法
  12. ICASSP 2022 语音合成和语音识别简报
  13. iis 6.0部署asp网站
  14. Cat.1、Cat.4、4G之间的区别
  15. 网站SEO优化之图片优化方法
  16. matlab如何弄上标,[转载]在Matlab中怎样输入特殊符号或者上标、下标
  17. GoldenGate添加进程及初始化
  18. jQuery 遍历 - 后代 【后代是子、孙、曾孙等等。children()查找下一个子元素; find()查找所有后代】
  19. 杰理之一拖八烧录器烧写外挂flash说明【篇】
  20. 2020.01.12日常总结

热门文章

  1. mysql_ddl(库、表、数据类型、常见约束)
  2. Advanced Graphics and Animations for iOS Apps
  3. SSM中 web.xml配置文件
  4. 在IDEA中编辑struts国际化properties文件
  5. 车聘网框架及源码介绍
  6. [原]减小VC6编译生成的exe文件的大小
  7. url中文传参乱码问题
  8. Ext学习笔记01 - NameSpace,类实例属性,类实例方法,类静态方法
  9. ubuntu下txt文件中文显示乱码的方法【转载】
  10. NickLee.FortuneBase(2010.1_B) For Oracle92i/10g/11g