Go 语言函数式编程系列教程(八) —— 数据类型篇:数组及其使用

栏目: 编程语言 · 发布时间: 5年前

内容简介:数组是所有语言编程中最常用的数据结构之一,Go 语言也不例外,与 PHP、JavaScript 等弱类型动态语言不同,在 Go 语言中,数组是固定长度的、同一类型的数据集合。数组中包含的每个数据项被称为数组元素,一个数组包含的元素个数被称为数组的长度。和 PHP 一样,Go 语言也通过从以上示例可以看出,数组也可以是多维的,与 PHP 不同的是,Go 语言中数组元素必须是同一个数据类型,并且需要在声明的时候指定元素类型和数组长度(静态语言的特征)。

数组的声明和初始化

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

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

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 语言中数组元素必须是同一个数据类型,并且需要在声明的时候指定元素类型和数组长度(静态语言的特征)。

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

a := [5]int{1,2,3,4,5}

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

a := [...]int{1, 2, 3}

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

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

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

上述代码的打印结果是:

[1 2 3 0 0]

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

a := [5]int{1: 3, 3: 7}

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

[0 3 0 7 0]

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

arrLength := len(arr)

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

访问数组元素

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

arr := [5]int{1,2,3,4,5}
a1, a2 := arr[0], arr[len(arr) - 1]

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

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

遍历数组

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

for i := 0; i < len(arr); i++ {
    fmt.Println("Element", i, "of arr is", arr[i])
}

上述代码的打印结果是:

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 ,用于快速遍历数组中的元素:

for i, v := range arr { 
    fmt.Println("Element", i, "of arr is", v) 
}

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

foreach ($arr as $k => $v) {
    // ...
}

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

for _, v := range arr {
   // ...
}

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

for i := range arr {
   // ...
}

设置数组元素

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

arr[0] = 100

多维数组

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

// 通过二维数组生成九九乘法表
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()
}

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

Go 语言函数式编程系列教程(八) —— 数据类型篇:数组及其使用


以上所述就是小编给大家介绍的《Go 语言函数式编程系列教程(八) —— 数据类型篇:数组及其使用》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

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

Visual Thinking

Visual Thinking

Colin Ware / Morgan Kaufmann / 2008-4-18 / USD 49.95

Increasingly, designers need to present information in ways that aid their audiences thinking process. Fortunately, results from the relatively new science of human visual perception provide valuable ......一起来看看 《Visual Thinking》 这本书的介绍吧!

JSON 在线解析
JSON 在线解析

在线 JSON 格式化工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具