这是我参与「第五届青训营」伴学笔记创作活动的第 1 天
前言
参加青训营学习的第一天,课程主要围绕Go语言基础展开,介绍了Go语言相较于其他语言的特点、开发环境,对Go语言基础语法和常用标准库进行了速览,也通过是猜谜游戏、命令行词典和SOCKS5代理三个案例加深了我们对知识点的了解。
在学习Go语言之前,我没有接触过“切片”这一概念,因此基于课堂学习,参考相关资料,在此对“切片”的学习做一些记录分享。
切片介绍
概念和语法
概念
切片(slice)在Go语言中指的是变长的序列,用于弥补数组长度不可变的不足,用于更便捷地操作数据序列。
语法
- 切片声明
// 切片类型声明格式
var identifier []Type
// 声明字符串切片
var strList []string
// 声明整型切片
var numList []int
// 声明一个空切片
var numListEmpty = []int{}
- 使用make()函数构造切片
//格式,cap可以省略
make([]Type, size, cap)
//示例
slice := make([]int, 2)
- 从字面量创建切片
// 大小和容量都为100,并且初始化第100个元素的值为100
slice := []int{99: 100}
- 从数组或切片创建切片
slice := []int{10, 20, 30}
newSlice := slice[1:3]
- 切片截取:通过设置上下限实现
s := []string{"a", "b", "c", "d", "e", "f"}
fmt.Println(s[2:5]) // [c d e]
fmt.Println(s[:5]) // [a b c d e]
fmt.Println(s[2:]) // [c d e f]
- append()和copy()函数
var numbers []int
//append,添加元素
numbers = append(numbers, 0)
//copy,拷贝numbers内容到numbers1
copy(numbers1,numbers)
底层原理
Go语言中的切片可以看作是有3个字段的结构体,这3个字段分别指向底层数组的指针、切片的长度以及切片的容量。切片与数组联系非常密切,切片引入了一个抽象层,提供了对数组中部分连续片段的引用,而作为数组的引用,我们可以在运行区间修改它的长度和范围。当切片底层的数组长度不足时就会触发扩容(如调用append()时),切片指向的数组发生变化,而切片的数据结构并不会发生变化,只是数值做了相应的更新。
与其他语言的比较
- 切片作为一个长度可变的数据结构,在使用上拥有普通数组不具备的便利性,相当于java语言中的List容器,各编程语言虽然具体实现方式不同,但拥有相同的设计思想。
- Python中也存在切片的概念,Python中的切片是指对序列对象的高级索引方法,取出序列中一个范围对应的元素,类似于Go切片中的截取,但仍存在区别(如Python修改切片元素的值源序列对象不受影响等)。
课后个人总结
通过课程和相关资料的学习,对切片的相关知识有了更深入的了解。目前虽然对Go语言的基础语法有了初步的了解,但仍有许多细节尚待探究,后续的笔记依旧会专注于对陌生知识点的深入学习。