作者:ww心海星空 | 来源:互联网 | 2023-10-10 11:35
初识
Slice(切片)代表变长的序列,序列中每个元素都有相同的类型。一个slice类型一般写作[]T,其中T代表slice中元素的类型;slice的语法和数组很像,只是没有固定长度而已,slice在底层引用了一个数组对象。
slice的长度对应slice中元素的数目;
长度不能超过容量,容量一般是从slice的开始位置到底层数据的结尾位置。内置的len和cap函数分别返回slice的长度和容量。
slice的切片操作s[i:j],其中0 ≤ i≤ j≤ cap(s),用于创建一个新的slice,引用s的从第i个元素开始到第j-1个元素的子序列。
切片操作超出cap(s)的上限将导致一个panic异常,但是超出len(s)则是意味着扩展了slice
我们先定义一个底层数组:
months := [...]string{1: "January", , 12: "December"}
让我们分别定义表示第二季度和北方夏天月份的slice,它们有重叠部分:
Q2 := months[4:7]
summer := months[6:9]
fmt.Println(Q2)
fmt.Println(summer)
我们可以看到,切片操作s[i:j]返回新的slice,它的长度len是j-i,它的容量cap是底层数组的长度减去开始截取的元素所在的索引 i
两个slice之间不能做比较,slice唯一合法的操作是和nil做比较,例如:
if summer == nil { }
如果你需要测试一个slice是否是空的,使用len(s) ==0 来判断,而不是 s == nil来判断。
下面的例子,展示了slice底层公用一个数组
func main() {s1 := make([]int, 3) s2 := s1 s2[0] = 100fmt.Println(s1) fmt.Println(s2)
}
append函数
Go语言的内建函数append()可以为切片动态添加元素。 可以一次添加一个元素,可以添加多个元素,也可以添加另一个切片中的元素(后面加…)。
func main(){var s []ints = append(s, 1) s = append(s, 2, 3, 4) s2 := []int{5, 6, 7} s = append(s, s2...)
}
var citySlice []string
citySlice = append(citySlice, "北京")
citySlice = append(citySlice, "上海", "广州", "深圳")
a := []string{"成都", "重庆"}
citySlice = append(citySlice, a...)
fmt.Println(citySlice)
Go语言内建的copy()函数可以迅速地将一个切片的数据复制到另外一个切片空间中,copy()函数的使用格式如下:
copy(destSlice, srcSlice []T)
其中:
srcSlice: 数据来源切片
destSlice: 目标切片
示例:
func main() {a := []int{1, 2, 3, 4, 5}c := make([]int, 5, 5)copy(c, a) fmt.Println(a) fmt.Println(c) c[0] = 1000fmt.Println(a) fmt.Println(c)
}
go语言没有提供删除元素的函数,我们根据slice本身特性来删除
func main() {a := []int{30, 31, 32, 33, 34, 35, 36, 37}a = append(a[:2], a[3:]...)fmt.Println(a)
}
总结:要从切片a中删除索引为index的元素,操作方法是a = append(a[:index], a[index+1:]…)