golang碎片整理之数组与切片

**数组 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

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]

名称栏目:golang碎片整理之数组与切片
URL网址:http://azwzsj.com/article/gjssgs.html