golang碎片整理之 数组与切片

栏目: Go · 发布时间: 5年前

内容简介:**数组 Array**数组是一种内建的类型,是一组同类型数据的集合,是一种值类型,可以通过从0开始的下标索引访问元素值,在初始化后其长度就固定了,无法修改其长度,而且Array的长度也是其类型的一部分,可以通过其内置函数len(array)获取其长度,当它作为方法的参数传入时,将复制一份数组,而不是引用同一个指针。初始化:

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

嵌入式系统开发之道

嵌入式系统开发之道

2011-12 / 69.00元

《嵌入式系统开发之道:菜鸟成长日志与项目经理的私房菜》用平易朴实的语言,以一个完整的嵌入式系统的开发流程为架构,通过一位“菜鸟”工程师与项目经理的诙谐对话,故事性地带出嵌入式系统概念及开发要素,并点出要成为一名称职的嵌入式系统工程师,在实际工作中所必须具备的各项知识及技能。 《嵌入式系统开发之道:菜鸟成长日志与项目经理的私房菜》可以分为三大部分:第1、3、4、17、18、19章和附录D为嵌入......一起来看看 《嵌入式系统开发之道》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具

html转js在线工具
html转js在线工具

html转js在线工具