你了解Go语言嘛?(十) | 青训营笔记

101 阅读3分钟

大家好!这是我参与「第五届青训营 」笔记创作活动的第10天。

我是一名在校大二的学生,很荣幸的参加本次青训营,所以我想把我在这次青训营的学习经历通过这次活动记录下来,和本次参加项目的小伙伴一起学习探讨,今天讲解的是go语言基础的第十节。加油!学习永无止境!💪💪💪

GO语言

8.6、关于切片的长度和容量

切片拥有自己的长度和容量,我们可以通过使用内置的len()函数求长度,使用内置的cap()函数求切片的容量。

        切片的长度就是它所包含的元素个数。

        切片的容量是从它的第一个元素开始数,到其底层数组元素末尾的个数。

        切片s 的长度和容量可通过表达式len(s) 和cap(s) 来获取。

s := []int{2, 3, 5, 7, 11, 13}
fmt.Println(s)
fmt.Printf("长度:%v 容量%v\n", len(s), cap(s))
c := s[:2]
fmt.Println(c)
fmt.Printf("长度:%v 容量%v\n", len(c), cap(c))
d := s[1:3]
fmt.Println(d)
fmt.Printf("长度:%v 容量%v", len(d), cap(d))
输出:
	[2 3 5 7 11 13]
	长度:6 容量6
	[2 3]
	长度:2 容量6
	[3 5]
	长度:2 容量5

8.7、切片的本质

        切片的本质就是对底层数组的封装,它包含了三个信息:底层数组的指针、切片的长度(len)和切片的容量(cap)。

8.8、使用make()函数构造切片

        我们上面都是基于数组来创建的切片,如果需要动态的创建一个切片,我们就需要使用内置的make()函数,格式如下:

make([]T, size, cap)
 
其中:
	1. T:切片的元素类型
	2. size:切片中元素的数量
	3. cap:切片的容量

8.9、切片不能直接比较

        切片之间是不能比较的,我们不能使用==操作符来判断两个切片是否含有全部相等元素。切片唯一合法的比较操作是和nil 比较。一个nil 值的切片并没有底层数组,一个nil 值的切片的长度和容量都是0。但是我们不能说一个长度和容量都是0 的切片一定是nil,例如下面的示例:

var s1 []int //len(s1)=0;cap(s1)=0;s1==nil
s2 := []int{} //len(s2)=0;cap(s2)=0;s2!=nil
s3 := make([]int, 0) //len(s3)=0;cap(s3)=0;s3!=nil

         所以要判断一个切片是否是空的,要是用len(s) == 0 来判断,不应该使用s == nil 来判断

8.10、切片是引用数据类型--注意切片的赋值拷贝

        下面的代码中演示了拷贝前后两个变量共享底层数组,对一个切片的修改会影响另一个切片的内容,这点需要特别注意。

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