温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

golang碎片整理之 数组与切片

发布时间:2020-07-08 14:36:01 来源:网络 阅读:463 作者:霍帅兵 栏目:编程语言

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


向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI