Go语言学习(六)---Slice
slice(切片)类型,是Go语言中的一种引用类型,如果你将一个切片赋值给另外一个切片,这两个切片将引用同一个底层数组。这与传递一个指向底层数组的指针相类似。
确切地说,slice就是一个指向array的指针。
slice的创建:
//通过make直接创建 s1 := make([]int, 10) fmt.Println(s1) //[0 0 0 0 0 0 0 0 0 0] // 这不是创建数组哦~~创建数组是[n]<type>或者[...]<type> s2 := []int{1, 2, 3, 4, 5} fmt.Println(s2) //[1 2 3 4 5]
通过上述2中方式都可以直接创建slice。(引用类型一般都通过make来创建)
不过,如果给定一个array 或者其他slice,一个新slice 通过a[I:J] 的方式创建。
这会创建一个新的slice,指向a,从序号I 开始,结束在序号J之前。长度为J - I。即[I,J)
例如:
a := [...]int{1, 2, 3, 4, 5}
fmt.Println(a) //[1 2 3 4 5]
s1 := a[2:4] //[3 4]
fmt.Println(s1)
//s1[0] = 99 //3--->99
//fmt.Println(s1)
//fmt.Println(a)
s2 := a[1:5] //[2 3 4 5]
fmt.Println(s2)
//这是a[0:len(a)]的简化写法
s3 := a[:] //[1 2 3 4 5]
fmt.Println(s3)
//这是a[0:4]的简化写法
s4 := a[:4] //[1 2 3 4]
fmt.Println(s4)
s5 := s2[:] //[2 3 4 5]
fmt.Println(s5)
上面的代码中,创建的s1~s5都指向数组a,所以,通过s1~s5更改任意一个值,都会反映到数组a中。
也就是说,s1[0] = 99之后,s1~s5已经数组a里面的3都变成了99。
slice的扩展:
append:函数append 向slice s 追加零值或其他x 值,并且返回追加后的新的、与s 有相同类型的slice。
package main import "fmt" func main() { s0 := make([]int, 10) for i := 0; i < 10; i++ { s0[i] = i } fmt.Println(s0) s1 := append(s0, 2) //追加一个元素 fmt.Println(s1) s2 := append(s1, 3, 5, 7) //追加多个元素 fmt.Println(s2) s3 := append(s2, s0...) //追加一个slice,注意这三个点!! fmt.Println(s3) }
Copy:函数copy 从源slice src 复制元素到目标dst,并且返回复制的元素的个数。
var a = [...]int{0, 1, 2, 3, 4, 5, 6, 7} var s = make([]int, 6) n1 := copy(s, a[0:]) //将a(从0开始)拷贝到s中,s长度只有6,所以拷贝[0 1 2 3 4 5] fmt.Println(n1) //6 fmt.Println(s) //[0 1 2 3 4 5] n2 := copy(s, s[2:]) //将s(从2开始)拷贝到s中,只拷贝了[2 3 4 5]四个数,覆盖了s的前四个数 fmt.Println(n2) //4 fmt.Println(s) //[2 3 4 5 4 5]