大家好!这是我参与「第五届青训营 」笔记创作活动的第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
注意: 对切片进行再切片时,索引不能超过原数组的长度,否则会出现索引越界的错误。