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

92 阅读3分钟

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

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

GO语言

8、切片

8.1、切片的定义

​        切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装。它非常灵活,支持自动扩容。切片是一个引用类型,它的内部结构包含地址、长度和容量。         声明切片类型的基本语法如下:

var name []T 

其中: 
        1. name:表示变量名 
        2. T:表示切片中的元素类型
package main
import "fmt"
func main() {
	// 声明切片类型
	var a []string //声明一个字符串切片
	var b = []int{} //声明一个整型切片并初始化
	var c = []bool{false, true} //声明一个布尔切片并初始化
	var d = []bool{false, true} //声明一个布尔切片并初始化
	fmt.Println(a) //[]
	fmt.Println(b) //[]
	fmt.Println(c) //[false true]
	fmt.Println(a == nil) //true
	fmt.Println(b == nil) //false
	fmt.Println(c == nil) //false
	fmt.Println(c == d) //切片是引用类型,不支持直接比较,只能和nil 比较
}

8.2、关于nil 的认识

        当你声明了一个变量, 但却还并没有赋值时, golang 中会自动给你的变量赋值一个默认零值。这是每种类型对应的零值。

bool -> false 
numbers -> 0 
string-> "" 
pointers -> nil 
slices -> nil 
maps -> nil 
channels -> nil 
functions -> nil 
interfaces -> nil

8.3、切片的循环遍历

        切片的循环遍历和数组的循环遍历是一样的

var a = []string{"北京", "上海", "深圳"}
// 方法1:for 循环遍历
for i := 0; i < len(a); i++ {
	fmt.Println(a[i])
}
// 方法2:for range 遍历
for index, value := range a {
	fmt.Println(index, value)
}

8.4、基于数组定义切片

        由于切片的底层就是一个数组,所以我们可以基于数组定义切片。

func main() {
	// 基于数组定义切片
	a := [5]int{55, 56, 57, 58, 59}
	b := a[1:4] //基于数组a 创建切片,包括元素a[1],a[2],a[3]
	fmt.Println(b) //[56 57 58]
	fmt.Printf("type of b:%T\n", b) //type of b:[]int
}
还支持如下方式:
	c := a[1:] //[56 57 58 59]
	d := a[:4] //[55 56 57 58]
	e := a[:] //[55 56 57 58 59]

8.5、切片再切片

        除了基于数组得到切片,我们还可以通过切片来得到切片。

func main() {
	//切片再切片
	a := [...]string{"北京", "上海", "广州", "深圳", "成都", "重庆"}
	fmt.Printf("a:%v type:%T len:%d cap:%d\n", a, a, len(a), cap(a))
	b := a[1:3]
	fmt.Printf("b:%v type:%T len:%d cap:%d\n", b, b, len(b), cap(b))
	c := b[1:5]
	fmt.Printf("c:%v type:%T len:%d cap:%d\n", c, c, len(c), cap(c))
}
输出:
	a:[北京上海广州深圳成都重庆] type:[6]string len:6 cap:6
	b:[上海广州] type:[]string len:2 cap:5
	c:[广州深圳成都重庆] type:[]string len:4 cap:4

注意: 对切片进行再切片时,索引不能超过原数组的长度,否则会出现索引越界的错误。