Logo
Section 1 / 6

处理数组

本节课讲解了数组、多维数组以及如何在 Go 语言中打印它们。

导入

处理数组

本节课讲解了数组、多维数组以及如何在 Go 语言中打印它们。

数组

类型 [n]T 表示由 n 个类型为 T 的值组成的数组。

表达式:

1var a [10]int

声明了一个变量 a,它是一个包含十个整数的数组。

数组的长度是其类型的一部分,因此数组不能被重新调整大小。这看起来有些限制,但不用担心;Go 提供了更便捷的方式来处理数组。

来看下面这个例子:

1package main 2 3import "fmt" 4 5func main() { 6 var a [2]string // 长度为 2 的数组 7 a[0] = "Hello" // 数组 a 的第 0 个元素为 "Hello" 8 a[1] = "World" // 数组 a 的第 1 个元素为 "World" 9 fmt.Println(a[0], a[1]) // 输出 Hello World 10 fmt.Println(a) // 输出 [Hello World] 11}

再看另一个例子,帮助进一步理解:

1package main 2 3import "fmt" 4 5func main() { 6 var a [2]string 7 a[0] = "Hello" 8 a[1] = "World" 9 fmt.Println(a[0], a[1]) 10 fmt.Println(a) 11 12 primes := [6]int{2, 3, 5, 7, 11, 13} // 长度为 6 的质数数组 13 fmt.Println(primes) 14}

你也可以在声明数组的同时初始化其元素:

1package main 2 3import "fmt" 4 5func main() { 6 a := [2]string{"hello", "world!"} 7 fmt.Printf("%q", a) 8}

最后,你可以使用 省略号(ellipsis) 来让编译器根据初始值自动推断数组长度:

1package main 2 3import "fmt" 4 5func main() { 6 a := [...]string{"hello", "world!"} 7 fmt.Printf("%q", a) 8}

打印数组

注意我们是如何使用 fmt 包中的 Printf 函数,并通过 %q “动词”来为每个元素加上引号输出的。

如果我们使用 Println 或 %s 动词,结果会有所不同:

1package main 2 3import "fmt" 4 5func main() { 6 a := [2]string{"hello", "world!"} 7 fmt.Println(a) 8 // [hello world!] 9 fmt.Printf("%s\n", a) 10 // [hello world!] 11 fmt.Printf("%q\n", a) 12 // ["hello" "world!"] 13}

多维数组

你还可以创建多维数组:

1package main 2 3import "fmt" 4 5func main() { 6 var a [2][3]string 7 for i := 0; i < 2; i++ { 8 for j := 0; j < 3; j++ { 9 a[i][j] = fmt.Sprintf("row %d - column %d", i+1, j+1) 10 } 11 } 12 fmt.Printf("%q", a) 13 // [["row 1 - column 1" "row 1 - column 2" "row 1 - column 3"] 14 // ["row 2 - column 1" "row 2 - column 2" "row 2 - column 3"]] 15}

尝试访问或设置一个不存在的索引位置的值时,程序将无法通过编译。例如,尝试编译以下代码:

1package main 2 3func main() { 4 var a [2]string 5 a[3] = "Hello" 6}

这是因为我们的数组长度是 2,有效的索引只有 0 和 1。访问索引 3 会导致编译错误,提示该索引“越界”,因为数组只有两个元素,而我们试图访问第四个元素。

下一节我们将学习切片(Slices),这种类型在实际开发中更为常用,因为我们并不总是能提前知道所需数组的长度。

类型

Go 中的切片