前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Go 语言基础入门教程 —— 数据类型篇:数组及其使用

Go 语言基础入门教程 —— 数据类型篇:数组及其使用

作者头像
学院君
发布2019-08-08 10:04:24
8990
发布2019-08-08 10:04:24
举报
文章被收录于专栏:学院君的专栏

数组的声明和初始化

数组是所有语言编程中最常用的数据结构之一,Go 语言也不例外,与 PHP、JavaScript 等弱类型动态语言不同,在 Go 语言中,数组是固定长度的、同一类型的数据集合。数组中包含的每个数据项被称为数组元素,一个数组包含的元素个数被称为数组的长度。

和 PHP 一样,Go 语言也通过 [] 来标识数组类型,以下是一些常见的数组声明方法:

代码语言:javascript
复制
var a [8]byte // 长度为8的数组,每个元素为一个字节
var b [3][3]int // 二维数组(9宫格)
var c [3][3][3]float64 // 三维数组(立体的9宫格)
var d = [3]int{1, 2, 3}  // 声明时初始化
var e = new([3]string)   // 通过 new 初始化

从以上示例可以看出,数组也可以是多维的,与 PHP 不同的是,Go 语言中数组元素必须是同一个数据类型,并且需要在声明的时候指定元素类型和数组长度(静态语言的特征)。

还可以通过 := 对数组进行声明和初始化:

代码语言:javascript
复制
a := [5]int{1,2,3,4,5}

此外,还可以通过这种语法糖省略数组长度的声明:

代码语言:javascript
复制
a := [...]int{1, 2, 3}

这种情况下,Go 会在编译期自动计算出数组长度(3)。

数组在初始化的时候,如果没有填满,则空位会通过对应的元素类型空值填充:

代码语言:javascript
复制
a := [5]int{1, 2, 3}
fmt.Println(a)

上述代码的打印结果是:

代码语言:javascript
复制
[1 2 3 0 0]

此外,我们还可以初始化指定下标位置的元素值:

代码语言:javascript
复制
a := [5]int{1: 3, 3: 7}

这样数组 a 的元素值如下:

代码语言:javascript
复制
[0 3 0 7 0]

数组长度在定义后就不可更改,在声明时可以指定数组长度为一个常量或者一个常量表达式(常量表达式是指在编译期即可计算结果的表达式)。数组的长度是该数组类型的一个内置常量,可以用 Go 语言的内置函数 len() 来获取:

代码语言:javascript
复制
arrLength := len(arr)

注:PHP 数组非常强大,囊括了常规的数组(Array)、集合(Set)、列表(List)、字典(Map)等数据结构,Go 语言的数组和大多数其他静态语言的数组一样,索引只能是数字,在 PHP 中,我们把索引是数字的数组叫做索引数组,把索引包含字符串的数组叫做关联数组,所以 Go 语言中的数组可以对照 PHP 中的索引数组来理解,不能是那种包含字符串键值对的关联数组。

访问数组元素

和 PHP 索引数组一样,可以使用数组下标来访问 Go 语言数组中的元素,数组下标默认从 0 开始,len(arr)-1 表示最后一个元素的下标:

代码语言:javascript
复制
arr := [5]int{1,2,3,4,5}
a1, a2 := arr[0], arr[len(arr) - 1]

上面 a1 的值是 1a2 的值是 5

访问数组元素时,下标必须在有效范围内,比如对于一个长度为 5 的数组,下标有效范围是 0~4,超出这个范围编译时会报索引越界异常。

遍历数组

我们还可以通过一个 for 循环遍历所有数组元素:

代码语言:javascript
复制
for i := 0; i < len(arr); i++ {
    fmt.Println("Element", i, "of arr is", arr[i])
}

上述代码的打印结果是:

代码语言:javascript
复制
Element 0 of arr is 1
Element 1 of arr is 2
Element 2 of arr is 3
Element 3 of arr is 4
Element 4 of arr is 5

Go 语言还提供了一个关键字 range,用于快速遍历数组中的元素:

代码语言:javascript
复制
for i, v := range arr { 
    fmt.Println("Element", i, "of arr is", v) 
}

range 表达式返回两个值,第一个是数组下标索引值,第二个是索引对应数组元素值,这种用法和 PHP 中的 foreach 语法类似:

代码语言:javascript
复制
foreach ($arr as $k => $v) {
    // ...
}

如果我们不想获取索引值,可以这么做:

代码语言:javascript
复制
for _, v := range arr {
   // ...
}

如果只想获取索引值,可以这么做:

代码语言:javascript
复制
for i := range arr {
   // ...
}

设置数组元素

和字符串这种不可变值类型不一样,数组除了支持通过下标访问对应索引的元素值之外,还可以通过下标设置对应索引位置的元素值:

代码语言:javascript
复制
arr[0] = 100

多维数组

多维数组的操作与一维数组一样,只不过每个元素可能是个数组,在进行循环遍历的时候需要多层嵌套循环,下面我们通过 Go 语言的多维数组打印出九九乘法表来演示其基本使用:

代码语言:javascript
复制
// 通过二维数组生成九九乘法表
var multi [9][9]string
for j := 0; j < 9; j++ {
    for i := 0; i < 9; i++ {
            n1 := i + 1
            n2 := j + 1
            if n1 < n2 {  // 摒除重复的记录
                continue
            }
            multi[i][j] = fmt.Sprintf("%dx%d=%d", n2, n1, n1 * n2)
        }
  }

// 打印九九乘法表
for _, v1 := range multi {
    for _, v2 := range v1 {
        fmt.Printf("%-8s", v2)  // 位宽为8,左对齐
    }
    fmt.Println()
}

执行上述代码,结果如下:

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-06-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 极客书房 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 数组的声明和初始化
  • 访问数组元素
    • 遍历数组
    • 设置数组元素
    • 多维数组
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档