golang基础(13.数组及其使用)
数组的声明和初始化
数组是所有语言编程中最常用的数据结构之一,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 初始化
数组可以是多维的,但是声明数组必须指定同一个数据类型,且要在声明时候指定长度。<br />还可以通过 := 对数组进行声明和初始化:
a := [5]int{1,2,3,4,5}
此外还可以通过…省略号的方式忽略数组长度
a := [...]int{1,2,3}
这种情况go会在编译期间自动计算出数组长度数组初始化的时候,如果没填充慢,空位即是对应元素的初始值
a := [5]int{1, 2, 3}
fmt.Println(a)
上述代码的打印结果是:
[1 2 3 0 0]
还可以初始化指定下标位置的元素值
a : = [5]int{1:3,2:4}
数组长度在定义后就不可更改,在声明时可以指定数组长度为一个常量或者一个常量表达式(常量表达式是指在编译期即可计算结果的表达式)。数组的长度是该数组类型的一个内置常量,可以用 Go 语言的内置函数 len() 来获取:
num :=len(arr)
访问数组元素
可以通过下标来获取数组的元素,下标默认从0开始,len(arr)-1表示数组最后一个元素的下标.
package main
import "fmt"
func main() {
a := [...]int{1, 2, 3}
fmt.Println(a)
b := [5]int{1: 1, 3: 5}
fmt.Println(b)
fmt.Println(b[3])
fmt.Println(b[len(b)-1])
}
遍历数组
我们可以通过for循环来遍历数组所有元素
package main
import "fmt"
func main() {
a := [...]int{1, 2, 3, 4, 5}
for i := 0; i < len(a); i++ {
fmt.Printf("Element %d is %d
", i, a[i])
}
}
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 语言的多维数组打印出九九乘法表来演示其基本使用:
package main
import "fmt"
func main() {
var milti [9][9]string
for i := 0; i < 9; i++ {
for j := 0; j < 9; j++ {
n1 := i + 1
n2 := j + 1
if n1 < n2 {
continue
}
milti[i][j] = fmt.Sprintf("%dx%d=%d", n2, n1, n1 * n2)
}
}
// 打印九九乘法表
for _, v1 := range milti {
for _, v2 := range v1 {
fmt.Printf("%-8s", v2) // 位宽为8,左对齐
}
fmt.Println()
}
}