**数组 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 mainimport "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 mainimport "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]