Go 数组
最后修改于 2025 年 5 月 3 日
在本文中,我们将展示如何在 Golang 中使用数组。
Go 中的数组是共享相同数据类型的元素的集合。数组的大小是固定的,这意味着它们的长度在声明时确定,并且在程序执行期间不能修改——不能扩展也不能缩减。
数组元素使用从零开始的索引进行访问,第一个元素位于索引 0 处。这允许使用数组内元素的位置直接访问任何元素。默认情况下,当数组声明时没有指定值时,其元素将使用零值进行初始化,例如整数的 0,浮点数的 0.0,布尔值的 false,以及字符串类型的空字符串 ("")。
要获取数组中的元素总数,Go 提供了 len 函数,该函数返回其长度。此函数对于遍历数组或在执行操作之前验证其大小很有用。
由于数组的大小是固定的,Go 通常更倾向于使用 切片 (slices) 来进行更灵活的数据管理。切片在保持相似的索引行为的同时,提供了动态调整大小和其他功能。
声明数组
var a[n]T
我们声明一个长度为 n、类型为 T 的数组。
var a[5]int
这里我们声明一个包含五个整数的数组。
a := [5]int{1, 2, 3, 4, 5}
这是 Go 数组的简写声明和初始化。
数组初始化
以下示例显示了如何在 Go 中初始化数组。
package main
import "fmt"
func main() {
var vals [2]int
fmt.Println(vals)
vals[0] = 1
vals[1] = 2
fmt.Println(vals)
}
在代码示例中,我们声明了一个整数数组;该数组可以容纳两个元素。
var vals [2]int fmt.Println(vals)
[2]int 是整个类型,包括大小数字。开始时,数组包含 0。
vals[0] = 1 vals[1] = 2 fmt.Println(vals)
我们将两个值赋给数组。
$ go run main.go [0 0] [1 2]
数组字面量
Golang 有数组字面量;我们可以将数组的元素指定在 {} 括号之间。
package main
import "fmt"
func main() {
vals := [5]int{1, 2, 3, 4, 5}
fmt.Println(vals)
vals2 := [5]int{1, 2, 3}
fmt.Println(vals2)
}
在代码示例中,我们定义了两个数组,使用数组字面量。
vals := [5]int{1, 2, 3, 4, 5}
第一个数组有五个元素;所有元素都在 {} 括号之间初始化。
vals2 := [5]int{1, 2, 3}
这里我们只提供了五个元素中的三个;其余元素初始化为 0。
$ go run main.go [1 2 3 4 5] [1 2 3 0 0]
在数组字面量中,我们可以提供元素的索引。
package main
import "fmt"
func main() {
vals := [5]int{1: 6, 2: 7, 4: 9}
fmt.Println(vals)
}
在代码示例中,我们使用数组字面量初始化数组。为值提供了它们的索引;数组的其他元素被赋予 0 值。
$ go run main.go [0 6 7 0 9]
推断数组长度
Go 可以使用数组字面量推断数组的长度。为此,我们使用省略号 ... 运算符。
package main
import "fmt"
func main() {
vals := [...]int{ 1, 2, 3, 4, 5, 6 }
fmt.Println(vals)
}
在代码示例中,我们在数组声明中使用 ...。这告诉 Go 从提供的数组字面量推断数组的长度。
$ go run main.go [1 2 3 4 5 6]
... 运算符时,我们实际上是在创建一个 Go 切片。要在 Go 中提取类型信息,我们使用 reflect 包。
package main
import (
"fmt"
"reflect"
)
func main() {
var a [5]int
var b []int
fmt.Println(reflect.ValueOf(a).Kind())
fmt.Println(reflect.ValueOf(b).Kind())
}
a 是一个数组,而 b 是一个切片。
$ go run main.go array slice
数组长度
数组的长度由 len 函数确定。
package main
import "fmt"
func main() {
words := [5]string{ "falcon", "sky", "earth", "cloud", "fox" }
fmt.Println("There are", len(words), "words in the array")
}
在代码示例中,我们定义了一个字符串数组。我们打印数组中单词的数量。
$ go run main.go There are 5 words in the array
数组索引
数组通过其索引进行访问。
package main
import "fmt"
func main() {
var words[5]string
words[0] = "falcon"
words[1] = "sky"
words[2] = "earth"
words[3] = "cloud"
words[4] = "fox"
fmt.Println(words[0], words[1])
fmt.Println(words)
}
在代码示例中,我们使用一个单词数组。
var words[5]string
我们声明了一个包含五个元素的字符串数组。
words[0] = "falcon" words[1] = "sky" words[2] = "earth" words[3] = "cloud" words[4] = "fox"
我们将五个单词放入数组。
fmt.Println(words[0], words[1])
我们打印数组的第一个和第二个元素。
fmt.Println(words)
我们打印整个数组。
$ go run main.go falcon sky [falcon sky earth cloud fox]
我们可以使用 : 冒号字符来获取数组的一部分。
package main
import "fmt"
func main() {
words := [...]string{ "falcon", "sky", "earth", "cloud", "fox" }
fmt.Println(words[0:2])
fmt.Println(words[1:])
fmt.Println(words[:])
fmt.Println(words[:len(words)])
}
示例打印了已定义数组的各个部分。
$ go run main.go [falcon sky] [sky earth cloud fox] [falcon sky earth cloud fox] [falcon sky earth cloud fox]
数组迭代
使用 for 循环,我们可以在 Go 中迭代数组元素。
package main
import "fmt"
func main() {
words := []string{ "falcon", "sky", "earth", "cloud", "fox" }
for i := 0; i < len(words); i++ {
fmt.Println(words[i])
}
for idx, e := range words {
fmt.Println(idx, "=>", e)
}
j := 0
for range words {
fmt.Println(words[j])
j++
}
}
示例使用三种 for 循环形式来迭代单词数组。
$ go run main.go falcon sky earth cloud fox 0 => falcon 1 => sky 2 => earth 3 => cloud 4 => fox falcon sky earth cloud fox
Go 数组是值类型
与其他语言不同,Go 中的数组是值类型。这意味着当我们向新变量赋值一个数组或将数组传递给函数时,整个数组都会被复制。
package main
import "fmt"
func main() {
vals := [...]int{ 1, 2, 3, 4, 5, 6 }
vals2 := vals
vals2[0] = 11
vals2[1] = 22
fmt.Println(vals)
fmt.Println(vals2)
}
在代码示例中,我们定义了一个数组并将该数组赋给一个新变量。通过第二个变量进行的更改不会影响原始数组。
$ go run main.go [1 2 3 4 5 6] [11 22 3 4 5 6]
原始数组未更改。
多维数组
我们可以在 Go 中创建多维数组。我们需要额外的方括号和花括号对来表示额外的数组维度。
package main
import (
"fmt"
"math/rand"
)
func main() {
a := [2][2]int{
{1, 2},
{3, 4}, // the trailing comma is mandatory
}
fmt.Println(a)
var b [2][2]int
for i := 0; i < 2; i++ {
for j := 0; j < 2; j++ {
b[i][j] = rand.Intn(10)
}
}
fmt.Println(b)
}
我们使用整数二维数组。
a := [2][2]int{
{1, 2},
{3, 4}, // the trailing comma is mandatory
}
fmt.Println(a)
外部数组中有两个嵌套数组。
var b [2][2]int
for i := 0; i < 2; i++ {
for j := 0; j < 2; j++ {
b[i][j] = rand.Intn(10)
}
}
fmt.Println(b)
在第二种情况下,数组被初始化为随机值。我们使用两个 for 循环。
$ go run main.go [[1 2] [3 4]] [[9 4] [1 3]]
在下面的示例中,我们创建了一个三维数组。
package main
import "fmt"
func main() {
a := [3][2][2]int{
{ {1, 2}, {3, 4} },
{ {5, 6}, {7, 8} },
{ {9, 10}, {11, 12} },
}
fmt.Println(a)
fmt.Println(a[2][1][0])
}
我们需要三对 [] 和 {} 括号。
部分赋值
数组可以部分赋值。
package main
import "fmt"
func main() {
var a [5]int = [5]int{10, 20, 30}
fmt.Println(a)
}
数组的类型和大小必须匹配。没有值的元素将被初始化为零。
$ go run main.go [10 20 30 0 0]
最后两个元素被初始化为 0。
来源
在本文中,我们展示了 Golang 中的数组用法。