**数组 Array**
数组是一种内建的类型,是一组同类型数据的集合,是一种值类型,可以通过从0开始的下标索引访问元素值,在初始化后其长度就固定了,无法修改其长度,而且Array的长度也是其类型的一部分,可以通过其内置函数len(array)获取其长度,当它作为方法的参数传入时,将复制一份数组,而不是引用同一个指针。
初始化:
[5]int{1,2,3,4,5} #长度为5的数组,其值分别为1,2,3,4,5
[5]int{1,2} #长度为5的数组,其值分别为1,2,0,0,0 在初始化时,没有指定初值的元素,int类型的默认为0,string类型默认为"",bool类型默认为false
[...]int{1,2,3,4,5} #长度为5的数组,其长度由初始化时元素的个数决定
[5]int{2:1,3:2,4:3} #长度为5的数组,key:value ,其值分别为0,0,1,2,3; 初始化时指定了2、3、4号索引的值分别为1,2,3
[...]int{2:1,4:3} #长度为5的数组,其值分别为0,0,1,0,3, 长度为5(由元素个数决定)
赋值与使用:
package main import "fmt" func test1(){ arr := [...]int{1,2,3,4,5} arr[4]=arr[4]+len(arr) fmt.Println(len(arr)) fmt.Println(arr) } func test2(){ arr2 := [...]int{2:3,3:1,4:0} for index, value := range arr2 { fmt.Printf("arr2[%d] = %d\n",index,value) } fmt.Println("-------------") for index := 0;index<len(arr2);index++ { fmt.Printf("arr2[%d] = %d\n",index,arr2[index]) } } func main(){ test1() test2() }
array 是值类型,将一个数组复制给另一个数组时,实际上是重新复制了一份元素集合。
func test3(){ arr3 := [5]int{2,3} arr5 := arr3 arr3[3]=9 arr5[0]=1 fmt.Printf("arr3=%d\n arr5=%d\n arr5[0]==arr3[0]=%t",arr3,arr5,arr5[0]==arr3[0]) } func main(){ // test1() // test2() test3() }
**切片 Slices**
数组的长度是不可变的,那么在特定的场景中这样的集合就不适合了,于是golang提供了一种功能强悍的内置类型slices,相比于数组array,切片slices的长度是不固定的,可以追加元素,追加元素的时候可能是切片的容量增大。切片slices有两个概念:一个是长度len,一个是容量cap。
初始化
切片可以通过数组来初始化,也可以通过内置函数make()初始化,初始化时len=cap,在追加元素时,当容量不足时,cap将按照len的2倍扩容。
s := []int{1,2,3} #直接初始化切片,切片的初始值为1,2,3;len=cap=3
s := arr[:] #初始化切片s,是数组arr的引用
s := arr[startIndex:endIndex] #将arr中从下标startIndex到endIndex-1 下的元素创建为一个新的切片
s := arr[startIndex:] #缺省endIndex时将表示一直到arr的最后一个元素
s := arr[:endIndex] #缺省startIndex时将表示从arr的第一个元素开始
s1 := s[startIndex:endIndex] #通过切片s,来初始化切片s1
s :=make([]int,len,cap) #通过内置函数make()初始化切片s,[]int 标识为其元素类型为int的切片
赋值与引用
package main import "fmt" func main(){ s0 := []int{1,2,3,4,5} s1 := s0[1:] fmt.Println("s1=",s1) s0[1]=1 fmt.Println(s1) arr := [...]int{1,2,3,4,6} s2:=arr[:] fmt.Printf("arr=%d, s2=%d\n",arr,s2) arr[3]=3 fmt.Printf("arr=%d,s2=%d\n",arr,s2) fmt.Println("s0=",s0,"s2=",s2,"arr=",arr) s2 = append(s2, s0...) s2 = append(s2, arr[:]...) //追加数组元素 fmt.Println("s2=", s2) s3 := append(s1, 7, 9, 11) fmt.Println("s3=", s3) }
output
s1= [2 3 4 5] [1 3 4 5] arr=[1 2 3 4 6], s2=[1 2 3 4 6] arr=[1 2 3 3 6],s2=[1 2 3 3 6] s0= [1 1 3 4 5] s2= [1 2 3 3 6] arr= [1 2 3 3 6] s2= [1 2 3 3 6 1 1 3 4 5 1 2 3 3 6] s3= [1 3 4 5 7 9 11]
有疑问加站长微信联系(非本文作者)