初识

Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已,slice在底层引用了一个数组对象。

  • 长度和容量

slice的长度对应slice中元素的数目;
长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。内置的len和cap函数分别返回slice的长度和容量。

slice的切片操作s[i:j],其中0 ≤ i≤ j≤ cap(s),用于创建一个新的slice,引用s的从第i个元素开始到第j-1个元素的子序列。

切片操作超出cap(s)的上限将导致一个panic异常,但是超出len(s)则是意味着扩展了slice

我们先定义一个底层数组:

months := [...]string{1: "January", /* ... */, 12: "December"}

让我们分别定义表示第二季度和北方夏天月份的slice,它们有重叠部分:

Q2 := months[4:7]
summer := months[6:9]
fmt.Println(Q2) // ["April" "May" "June"]
fmt.Println(summer) // ["June" "July" "August"]

我们可以看到,切片操作s[i:j]返回新的slice,它的长度len是j-i,它的容量cap是底层数组的长度减去开始截取的元素所在的索引 i

  • slice的比较

两个slice之间不能做比较,slice唯一合法的操作是和nil做比较,例如:

if summer == nil { /* ... */ }
  • slice计算长度

如果你需要测试一个slice是否是空的,使用len(s) ==0 来判断,而不是 s == nil来判断。

  • slice赋值拷贝

下面的例子,展示了slice底层公用一个数组

func main() {s1 := make([]int, 3) //[0 0 0]s2 := s1             //将s1直接赋值给s2,s1和s2共用一个底层数组s2[0] = 100fmt.Println(s1) //[100 0 0]fmt.Println(s2) //[100 0 0]
}

append函数

Go语言的内建函数append()可以为切片动态添加元素。 可以一次添加一个元素,可以添加多个元素,也可以添加另一个切片中的元素(后面加…)。

func main(){var s []ints = append(s, 1)        // [1]s = append(s, 2, 3, 4)  // [1 2 3 4]s2 := []int{5, 6, 7}  s = append(s, s2...)    // [1 2 3 4 5 6 7]
}
  • 一次性追加多个元素
var citySlice []string
// 追加一个元素
citySlice = append(citySlice, "北京")
// 追加多个元素
citySlice = append(citySlice, "上海", "广州", "深圳")
// 追加切片
a := []string{"成都", "重庆"}
citySlice = append(citySlice, a...)
fmt.Println(citySlice) //[北京 上海 广州 深圳 成都 重庆]
  • copy函数的使用

Go语言内建的copy()函数可以迅速地将一个切片的数据复制到另外一个切片空间中,copy()函数的使用格式如下:

copy(destSlice, srcSlice []T)

其中:
srcSlice: 数据来源切片
destSlice: 目标切片

示例:

func main() {// copy()复制切片a := []int{1, 2, 3, 4, 5}c := make([]int, 5, 5)copy(c, a)     //使用copy()函数将切片a中的元素复制到切片cfmt.Println(a) //[1 2 3 4 5]fmt.Println(c) //[1 2 3 4 5]c[0] = 1000fmt.Println(a) //[1 2 3 4 5]fmt.Println(c) //[1000 2 3 4 5]
}
  • 切片删除元素

go语言没有提供删除元素的函数,我们根据slice本身特性来删除

func main() {// 从切片中删除元素a := []int{30, 31, 32, 33, 34, 35, 36, 37}// 要删除索引为2的元素a = append(a[:2], a[3:]...)fmt.Println(a) //[30 31 33 34 35 36 37]
}

总结:要从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]…)

go语言数据类型之切片slice相关推荐

  1. 【Go】Go 语言切片(Slice)

    文章目录 一.切片 二.声明切片 方法1 方法2 总结:创建切片的各种方式 三.切片初始化 1. 声明的同时初始化 2. 用数组初始化切片 3. 切片的内存布局: 读写操作实际目标是底层数组,只需注意 ...

  2. 【Go学习笔记】数据类型之切片(slice)

    切片 是Go中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.它非常灵活,支持自动扩容.切片的底层一段连续的内存. 切片的内部实现 ...

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

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

  4. Golang 入门 : 切片(slice)

    切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...

  5. go数组Array和切片Slice全面简述理解

    小聊:本文是小白刚学习 golang 时候的总结,在基本学习了解之上的特性比较与讨论,go的数组有什么不同?切片又有什么好处?怎么去区分它们的使用?外加一些知识的拓展,有利于加深对 go 的 Arra ...

  6. golang切片slice详解:介绍、内存分析、定义、遍历、切片可以继续切片、切片可以动态增长、切片的拷贝及底层原理

    切片的引入 [1]切片(slice)是golang中一种特有的数据类型 [2]数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见.相对的切片却是随处可见 ...

  7. 详解go语言的array和slice 【二】

    上一篇  详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲 ...

  8. 位置2的索引超出数组范围不能超过10_golang学习笔记--切片slice 与数组 arr

    因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...

  9. 切片 go 去除第一个_golang学习笔记--切片slice 与数组 arr

    因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...

最新文章

  1. HBase参数配置及说明
  2. qt 主动打开虚拟键盘_ipad键盘有用吗?
  3. C++ pair(对组)用法
  4. 强化学习6——Value-based RL和Policy-based RL 的区别
  5. 阻塞(Block)和非阻塞(Non-Block)
  6. inotify 机制
  7. HashMap 源码
  8. Oracle 20c 新特性:原生的 JSON 数据类型(Native JSON Datatype)
  9. Java Web学习总结(34)——拦截器和过滤器的差异总结
  10. LeetCode 213. 打家劫舍 II(动态规划)
  11. java 非模态_统计图钻取的明细报表在非模态窗口中显示
  12. (转)windows 下 Java 及 Python 环境变量设置
  13. Eclipse(PHP、JAVA)的快捷键大全
  14. JavaScript变量相关总结
  15. BitTorrent协议规范(BitTorrent Protocol Specification)之Peer Wire协议(Peer Wire Protocol)-第四部分...
  16. 前端常见的浏览器兼容性问题及解决方案
  17. postgresql中DROP OWNED BY user_name对普通用户和只读用户的区别
  18. 格林威治标准时间和协调世界时
  19. Oracle默认数据库角色账号密码
  20. 高斯消元法解线性方程组数学原理及Python手工实现

热门文章

  1. 深度学习系列笔记之统计基础
  2. 小程序(十六)小程序仿微信聊天页面及功能
  3. c语言定义寄存器中的两位,汇编语言:编写一个程序,显示AL寄存器中的两位十六进制数...
  4. python绘制等值线图_使用python祏rfer绘制等值线图的方式适题。
  5. 深度学习之 imgaug (图像增强)学习笔记
  6. pytorch-多卡GPU训练
  7. 计算机原理及应用自测题4,自测题-微计算机原理-电子发烧友网站
  8. 新婚老公的忏悔信(爆笑)[转]
  9. 数字化是指用计算机,数字化
  10. 安徽大学计算机学院张兴义教授,CCF YOCSEF合肥与CCF合肥分部联合成功举办 “2018CCF合肥为新研究生导航”活动...