Go语言中的数组(九)

我刚接触go语言的数组时,有点不习惯,因为相对于JavaScript这样的动态语言里的数组,go语言的数组写起来有点不爽。

 

定义数组

go语言定义数组的格式如下:

var a [3]int

var 数组名 [数组长度]数组每一项的类型

 

初始化数组时,要定义好数组的长度和数组值的类型。注意定义数组时,数组的长度数字应该是常量,如果使用变量来定义长度则会报错

var l = 3
var a [l]int

// 此时长度使用变量 l 来定义,会报错

 

同时,不同的数组长度和类型,导致最终的数组也是不同的类型:

var a [3]int
var b [5]int

// a 和 b 是不同的类型

 

数组赋值时是用 {},这点也是我最不习惯的地方:

func main() {
    var a [3]int
    a = [3]int{1,2,3}
    fmt.Println(a)  // [1 2 3]
}

注意打印的结果是中括号的,但是没有用 , 来隔开每一项。

 

上面是先定义再赋值的,有点繁琐,可以一步到位地简写:

func main() {
    a := [3]int{1,2,3}
    fmt.Println(a)
}

 

有时,我们一开始不知道数组的长度应该是多少,此时可以这样定义数组:


func main() {
a := [...]int{1,2,3}
fmt.Println(a)
}
// 用 ... 来表示未知的数组长度

 

同时,我们在初始化数组时也可以指定对应下标的值:

func main() {
    a := [...]int{2:10,5:12}
    fmt.Println(a) // [0 0 10 0 0 12]
} 

代码中在定义数组时,指定下标2位置上的值是10,下标5位置上的值是12,其余未指定值的默认为0

 

遍历数组

使用for 循环来遍历数组:

func main() {
    a := [...]int{1,2,3,4,5}
    for i:=0;i<5;i++{
        fmt.Println(a[i])
    }
}

// a[i] 是数组取值,格式:数组名[下标]

 

 

也可以使用 range 来遍历:

func main() {
    a := [...]int{1,2,3,4,5}
    for _,v := range a{
        fmt.Println(v)
    }
}

// _ 是占位,此位置本来是下标,此处不用下标所以用 _ 占位

 

二维数组

二维数组的定义如下:

func main() {
    a:=[3][2]int{
        [2]int{1,2},
        [2]int{3,4},
        [2]int{5,6},
    }
    fmt.Println(a)  // [[1 2] [3 4] [5 6]]
}

 

可以看到这样是比较繁琐的,其实可以简化为:

func main() {
    a:=[3][2]int{
        {1,2},
        {3,4},
        {5,6},
    }
    fmt.Println(a)  // [[1 2] [3 4] [5 6]]
}

 

如果你细心你会发现,我在最后一项后面加上了逗号,这是因为go语言的格式限制,这样收起花括号就不用加逗号了:

func main() {
    a:=[3][2]int{
        {1,2},
        {3,4},
        {5,6}}
    fmt.Println(a)
}

 

数组是值类型

没错,在go中数组是值类型,这与我之前接触到的一些动态语言可完全不一样。关于值类型和引用类型,我就不多说了。直接来看下例子吧:

package main

import "fmt"

func main() {
    var a = [3]int{1,2,3}
    var b = a
    a[0] = 4
    fmt.Printf("a:%v,b:%v",a,b) // a:[4 2 3],b:[1 2 3]
}

 

posted @ 2019-10-15 09:45  黑色瓶子  阅读(304)  评论(0编辑  收藏  举报