golang 切片(Slice)
切片为引用类型,切片(Slice)是一个拥有相同类型元素的可变长度的序列。它是基于数组类型做的一层封装,支持自动扩容。
切片的本质就是对底层数组的封装,由三个重要部分构成:
- 底层数组的指针
- 切片的长度(len)
- 和切片的容量(cap)
创建切片
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比较
}
切片的长度&容量
func main() {
a := [5]int{1, 2, 3, 4, 5}
s := a[1:3]
fmt.Printf("s:%v len(s):%v cap(s):%v\n", s, len(s), cap(s))
// Out: s:[2 3] len(s):2 cap(s):4
}
通过make动态创建切片
func main() {
// 创建一个内部为int类型,长度为2,容量为10的切片
a := make([]int, 2, 10)
fmt.Println(a) //[0 0]
fmt.Println(len(a)) //2
fmt.Println(cap(a)) //10
}
切片的比较
切片之间是不能进行直接比较的,要判断一个切片是否是空的,要是用len(s) == 0来判断,不应该使用s == 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
追加元素
ps: append之后要赋值到原切片才添加成功
func main(){
var s []int
s = 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]
}
删除元素
func main() {
// 从切片中删除索引为2的元素
a := []int{30, 31, 32, 33, 34, 35, 36, 37}
// 也就是把索引为2以后的所有元素追加到索引为2以前的切片里面
a = append(a[:2], a[3:]...)
fmt.Println(a) //[30 31 33 34 35 36 37]
}
copy复制切片
相当于对切片进行深拷贝
func main() {
// copy()复制切片
a := []int{1, 2, 3, 4, 5}
c := make([]int, 5, 5)
copy(c, a) //使用copy()函数将切片a中的元素复制到切片c
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1 2 3 4 5]
c[0] = 1000
fmt.Println(a) //[1 2 3 4 5]
fmt.Println(c) //[1000 2 3 4 5]
}
有疑问加站长微信联系(非本文作者)