zoukankan      html  css  js  c++  java
  • 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]
    }
  • 相关阅读:
    程序员都遇到过哪些误解?
    云原生系列5 容器化日志之EFK
    云原生系列4 批量定时更新本地代码库
    云原生系列3 pod核心字段
    云原生系列2 部署你的第一个k8s应用
    云原生系列1 pod基础
    项目总结二:使用分布式存储读写分离功能应要注意的问题
    项目总结一:HttpClient DelegatingHandler管道扩展 生命周期问题
    Java 反编译工具的使用与对比分析
    如何使用 Github Actions 自动抓取每日必应壁纸?
  • 原文地址:https://www.cnblogs.com/wjaaron/p/11662110.html
Copyright © 2011-2022 走看看