go语言数据类型之切片slice
初识
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相关推荐
- 【Go】Go 语言切片(Slice)
文章目录 一.切片 二.声明切片 方法1 方法2 总结:创建切片的各种方式 三.切片初始化 1. 声明的同时初始化 2. 用数组初始化切片 3. 切片的内存布局: 读写操作实际目标是底层数组,只需注意 ...
- 【Go学习笔记】数据类型之切片(slice)
切片 是Go中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.它非常灵活,支持自动扩容.切片的底层一段连续的内存. 切片的内部实现 ...
- go语言基础数据结构学习---- 数组, 列表(list)和切片(slice)
go语言基础数据结构学习–> 数组, 列表(list)和切片(slice) go 语言中的 数组是类型相同的元素的集合, 列表是双链表的容器, 可以添加不同类型的数据切片是对现有数组的引用, 比 ...
- Golang 入门 : 切片(slice)
切片(slice)是 Golang 中一种比较特殊的数据结构,这种数据结构更便于使用和管理数据集合.切片是围绕动态数组的概念构建的,可以按需自动增长和缩小.切片的动态增长是通过内置函数 append( ...
- go数组Array和切片Slice全面简述理解
小聊:本文是小白刚学习 golang 时候的总结,在基本学习了解之上的特性比较与讨论,go的数组有什么不同?切片又有什么好处?怎么去区分它们的使用?外加一些知识的拓展,有利于加深对 go 的 Arra ...
- golang切片slice详解:介绍、内存分析、定义、遍历、切片可以继续切片、切片可以动态增长、切片的拷贝及底层原理
切片的引入 [1]切片(slice)是golang中一种特有的数据类型 [2]数组有特定的用处,但是却有一些呆板(数组长度固定不可变),所以在 Go 语言的代码里并不是特别常见.相对的切片却是随处可见 ...
- 详解go语言的array和slice 【二】
上一篇 详解go语言的array和slice [一]已经讲解过,array和slice的一些基本用法,使用array和slice时需要注意的地方,特别是slice需要注意的地方比较多.上一篇的最后讲 ...
- 位置2的索引超出数组范围不能超过10_golang学习笔记--切片slice 与数组 arr
因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...
- 切片 go 去除第一个_golang学习笔记--切片slice 与数组 arr
因为我是写php的,刚开始写go的时候老是被数组坑.因为在go中的数组是固定长度,所以会存在越界的时候.而在go中也很少直接使用数组.更多的时候会使用slice(切片). 数组 数组是一个由固定长度的 ...
最新文章
- HBase参数配置及说明
- qt 主动打开虚拟键盘_ipad键盘有用吗?
- C++ pair(对组)用法
- 强化学习6——Value-based RL和Policy-based RL 的区别
- 阻塞(Block)和非阻塞(Non-Block)
- inotify 机制
- HashMap 源码
- Oracle 20c 新特性:原生的 JSON 数据类型(Native JSON Datatype)
- Java Web学习总结(34)——拦截器和过滤器的差异总结
- LeetCode 213. 打家劫舍 II(动态规划)
- java 非模态_统计图钻取的明细报表在非模态窗口中显示
- (转)windows 下 Java 及 Python 环境变量设置
- Eclipse(PHP、JAVA)的快捷键大全
- JavaScript变量相关总结
- BitTorrent协议规范(BitTorrent Protocol Specification)之Peer Wire协议(Peer Wire Protocol)-第四部分...
- 前端常见的浏览器兼容性问题及解决方案
- postgresql中DROP OWNED BY user_name对普通用户和只读用户的区别
- 格林威治标准时间和协调世界时
- Oracle默认数据库角色账号密码
- 高斯消元法解线性方程组数学原理及Python手工实现
热门文章
- 深度学习系列笔记之统计基础
- 小程序(十六)小程序仿微信聊天页面及功能
- c语言定义寄存器中的两位,汇编语言:编写一个程序,显示AL寄存器中的两位十六进制数...
- python绘制等值线图_使用python祏rfer绘制等值线图的方式适题。
- 深度学习之 imgaug (图像增强)学习笔记
- pytorch-多卡GPU训练
- 计算机原理及应用自测题4,自测题-微计算机原理-电子发烧友网站
- 新婚老公的忏悔信(爆笑)[转]
- 数字化是指用计算机,数字化
- 安徽大学计算机学院张兴义教授,CCF YOCSEF合肥与CCF合肥分部联合成功举办 “2018CCF合肥为新研究生导航”活动...