数组是 Go 里最基础的一类容器,但它和很多初学者熟悉的“可变长度列表”并不一样。理解它的关键,在于先抓住“长度固定”和“元素同类型”这两个约束,再去看声明、赋值和遍历的写法。下面按实际使用顺序梳理一遍,并用一个求和例子把前面的知识串起来。
什么是 Go 数组
数组可以理解为:一组固定长度、同类元素的集合。
这里有两个限制需要先记住:
- 固定长度:数组在声明时就要写明长度,后续不能再改。
- 同类元素:同一个数组中的元素必须是相同类型,不能混用。
这也是 Go 数组和很多动态语言列表最明显的区别。如果你已经知道数据项有几个,而且它们类型一致,数组就是一种直接、明确的表示方式。
数组怎么声明和赋值
先声明,再按下标赋值
比如,声明一个长度为 3、元素类型为 string 的数组:

var animals [3]string
赋值时使用索引,也就是下标。数组下标从 0 开始,最后一个下标是“长度减 1”。
animals[0] = "cat" // 给第一个元素赋值
animals[1] = "cattle" // 给第二个元素赋值
animals[2] = "sheep" // 给三个元素赋值
如果数组长度是 3,那么可用下标就是 0、1、2。写数组时,先确认长度和下标范围,能减少不少低级错误。
声明时直接初始化
数组也可以在声明的同时完成赋值:

// 声明并赋值
var numbers = [3]int{1, 2, 3}
// 声明时指定索引赋值
// 假设给第2个、第3个元素赋值
var numbers1 = [3]int{1: 2, 3}
第一种写法最常见,含义也直观。第二种写法则是先指定某个索引位置的值,再继续补后面的元素,适合需要明确某一位内容时使用。
让编译器自动推导数组长度
如果你不想手动写长度,也可以交给编译器根据元素个数自动推算:
var cities = [...]string{"北京", "上海", "广州"} // 该数组的长度就是其元素的个数3.
这里的 ... 表示由初始化内容决定数组长度。这个写法在元素已经明确列出的场景里很实用,既少写一个数字,也避免长度和元素数量不一致。
数组如何遍历
数组常见的读取方式就是循环遍历。Go 里主要有两种写法。
使用 for 按下标遍历
如果你需要自己控制下标,或者要配合索引访问元素,可以用传统的 for 循环:
for i := 0; i < len(cities); i++ {
// 使用索引获取数组的元素
fmt.Println(cities[1])
}
这种方式的重点是通过 len(cities) 获取数组长度,再让下标从 0 递增到最后一位。实际使用时,通常会通过变量 i 访问元素。
使用 for range 遍历值和索引
如果既想拿到索引,也想直接拿到元素值,那么 for range 更简洁:
for index, city := range cities {
// index为元素的索引,city为元素的值
fmt.Println(index, city)
}
在这段代码里,index 表示索引,city 表示当前位置上的值。对于“读取每一项并处理”的场景,这种写法通常更清楚,也更符合 Go 的日常风格。
用一个例子看数组求和
前面的声明和遍历放在一起,最典型的小练习就是求数组所有元素的和。
// 声明一个数组
var nums = [5]int{1, 2, 3, 4, 5}
// 声明求和的结果变里
var result int
for _, num := range nums {
result += num // 依次将数组的元素相加
}
fmt.Println(result) // 输出 15
这段代码可以拆成三步理解:
- 先声明一个包含 5 个整数的数组
nums。 - 再准备一个整型变量
result用来累计结果。 - 最后通过
for range依次取出每个元素,并累加到result中。
这里的 _ 表示当前不关心索引,只使用元素值 num。当你的目标只是统计、求和、求平均值时,这种写法会比手动操作下标更简洁。
几个容易记住的要点
- 数组长度在声明时确定,之后不能修改。
- 数组中的元素类型必须一致,比如都是
int或都是string。 - 下标从
0开始,最后一个下标是长度减 1。 - 初始化时可以写固定长度,也可以用
...自动推导。 - 遍历时既可以用
for,也可以用更常见的for range。
如果你只是入门 Go,先把数组的这几种基础写法掌握住,后面再去理解切片时,会更容易看出两者在长度和使用场景上的差别。













