Go切片基础知识

Go切片基础知识

/*Slice可理解为可变长数组Arrey,一般使用append()函数,详细用法查看Go语言文档。 1. 切片:切片是数组的一个引用,因此切片是引用类型。但自身是结构体,值拷贝传递。 2. 切片的长度可以改变,因此,切片是一个可变的数组。 3. 切片遍历方式和数组一样,可以用len()求长度。表示可用元素数量,读写操作不能超过该限制。 4. cap可以求出slice最大扩张容量,不能超出数组限制。0 <= len(slice) <= len(array),其中array是slice引用的数组。 5. 切片的定义:var 变量名 []类型,比如 var str []stringvar arr []int。 6. 如果 slice == nil,那么 len、cap 结果都等于 0。 */ package mainimport "fmt"/*Go语言中文文档 全局: var arr = [...]int{0, 1, 2, 3, 4, 5, 6, 7, 8, 9} var slice0 []int = arr[start:end] var slice1 []int = arr[:end] var slice2 []int = arr[start:] var slice3 []int = arr[:] var slice4 = arr[:len(arr)-1]//去掉切片的最后一个元素 局部: arr2 := [...]int{9, 8, 7, 6, 5, 4, 3, 2, 1, 0} slice5 := arr[start:end] slice6 := arr[:end] slice7 := arr[start:] slice8 := arr[:] slice9 := arr[:len(arr)-1] //去掉切片的最后一个元素 *///声明,初始化 var slice0 []int var slice1 []int=[]int{0,1,2,3,4} var slice2 =[]int{0,1,2,3,4,5} //打印 func slice(){ a:=[]int{1,2,3} fmt.Println(slice0,slice1,slice2) fmt.Printf("%T,%T,%T\n",slice0,slice1,slice2)//类型 fmt.Printf("slice0 的长度为:%d,容量为:%d\n", len(slice0), cap(slice0))//长度和容量 fmt.Println(a) //由于 切片是引用类型,所以你不对它进行赋值的话,它的零值(默认值)是 nil,如slice0 fmt.Println(slice0 == nil)//ture } /*result: [] [0 1 2 3 4] [0 1 2 3 4 5] []int,[]int,[]int slice0 的长度为:0,容量为:0 [1 2 3] */ //make构造Slice func makeslice(){ a := make([]int, 2) b := make([]int, 2, 10) fmt.Println(a, b) fmt.Println(a == nil)//false fmt.Println(len(a), len(b)) fmt.Println(cap(a), cap(b)) } /*result: [0 0] [0 0] 2 2 2 10 */ //append增加Slice容量cap func appendslice(){ var c []int=make([]int, 2) d := make([]int, 2, 10) fmt.Println("c是",c,len(c), len(c)) c=append(c,1,2,3) fmt.Println("c是",c,len(c), len(c)) fmt.Println("d是",d,len(d), len(d)) d=append(d,c...)//拼接 fmt.Println("d是",d,len(d), len(d)) } /* c是 [0 0] 2 2 c是 [0 0 1 2 3] 5 5 d是 [0 0] 2 2 d是 [0 0 0 0 1 2 3] 7 7 */ //copy func copyslice(){ var c []int=make([]int, 2) c=[]int{1,2} d := make([]int, 2, 10) d=c fmt.Println("c是",c,len(c), len(c)) fmt.Println("d是",d,len(d), len(d)) c[0]=3 fmt.Println("c是",c,len(c), len(c)) fmt.Println("d是",d,len(d), len(d)) d[0]=5 fmt.Println("c是",c,len(c), len(c)) fmt.Println("d是",d,len(d), len(d)) /*c是 [3 2] 2 2 ->d是 [3 2] 2 2 ; c是 [5 2] 2 2 ->d是 [5 2] 2 2*///可见Slice是引用类型 e := make([]int, 2, 10) copy(e,c)//把c copy e,深拷贝;也可copy(e,c[:])部分拷贝 fmt.Println("c是",c,len(c), len(c)) fmt.Println("e是",e,len(e), len(d)) c[1]=9 fmt.Println("c是",c,len(c), len(c)) fmt.Println("e是",e,len(e), len(d)) /*c是 [5 2] 2 2 ->e是 [5 2] 2 2 ; c是 [5 9] 2 2 ->e是 [5 2] 2 2*/ } //遍历 func visit(slice []int){ for _,d:=range slice{ fmt.Println(d,"\t") } } func main() { slice() makeslice() appendslice() copyslice() visit(slice1) }

    推荐阅读