Golang学习笔记(五):数组

371 阅读3分钟

原创作者,公众号【程序员读书】,欢迎关注公众号,转载文章请注明出处哦。

Go语言中的数组,与结构体一样,是一种复合数据类型,也是一种固定长度存放特定类型的序列,这一节,让我们一起来来学习一下吧。

声明与使用

Go数组有两个特征,一:固定长度,数组声明后长度便不能再修改,所以不灵活,在Go语言中,更多的是使用与数组相似的Slice类型,但Slice的底层是数组,因此有必要了解一下数组,二:数组只能存储一种特定类型,与结构体这种可能放多种数据类型不同。

在声明数组的时候,如果没有初始化,则以定义的类型零值作为每个数组的元素的初始化,如整型为0,字符串为""。

下面是定义数组的几种方式

package main

package main(){

    var i [5]int //定了长度为5的整型数组,每个元素的初始值为0
    
    var j [5]int = [5]int{1,3,5} //在声明的时候初始化,第三、四个元素值为0
    
    var k = [5]int{1,2,4} //通过表达式定义数组时,必须初始化,如果省略{1,3,4},不能通过编译
    
    p := [4]{1,2,4,5} //简短变量,必须初始化
    
    t := [...]{1,2,3,4}//当长度为...,则通过花括号中的元素个数来确定长度
    
    s := [5]{4:1}//也可通过指定下标值初始化,这样下标为4的元素值是1,其他元素值为零值
}
 

定义数组后,长度与类型不能变化,长度可能内置函数len()获取,可以通过下标值访问数组某个元素或为其赋值,下标从0开始,下标取值范围是0~len()-1。

package main

import "fmt"

func main(){
    
    a := [10]string{"a","b"}
    
    fmt.Println(len(a))//输出:5
    
    a[2] = "c" //通过下标赋值
    
    fmt.Println(a[3])//通过下标访问元素
}

相等比较与遍历

相同长度与类型的数组才可能进行相等比较,不然会报错,而只有数组中每个元素都相等,两个数组才相等。

除了通过元素下标访问数组外,更多的时候,我们可以通过for...range语句遍历整个数组。

package main

func main(){
    
    a1 := [5]int{1,2,3}
    
    a2 := [4]int{1,2,3}
    
    a3 := [5]int{1,3,4}
    
    a4 := [5]int{1,2,3}
    
    fmt.Println(a1 == a2)//报错
    
    fmt.Println(a1 == a3) // false,数组元素不相等
    
    fmt.Println(a1 == a4) // true
    
    for i,v := range a1 {//i为数组下标,v为数组元素的值
        fmt.Println(i,v)
    }
    
    for _,v := range a1 {//忽略下标值
        fmt.Println(v)
    }
    
}

作为参数传给函数

当我们把数组作为参数值传某个函数时,函数会复制一个数组副本,因此不会影响原来的数组且效率低,当我们想通过函数改变原来数组的元素时候,可以传通过一个数组指针来达到目的。

另外,作为参数传给数组时,长度与类型与函数形参必须一致,不然也会报错的。

package main

import "fmt"

func main(){
    
    var i [5]int
    
    var j [6]int
    
    changeArrayOne(i)
    fmt.Println(i)//[0,0,0,0,0],元素值并没有发生改变
    changeArrayTwo(&i)
    fmt.Println(i)//[0,100,0,0,0],第一个元素值为100
    
    changeArrayOne(j)//报错
}

func changeArrayOne(i [5]int){
    i[1] = 100   
}

func changeArrayTwo(i *[5]int){
    i[1] = 100   
}

由上面例子可以看到,将[6]int类型的数组,并不能赋值形参为[5]int的数组,且数组长度固定,不能像Slice一样,可以动态添加与删除元素,因此非常不灵活,另外一个就是传给函数时会复制一个数组副本,比较耗内存,虽然可以通过数组指针解决,但在实际开发中,比较常用的是引用类型Slice。


你的关注,是我写作路上最大的鼓励!