Go 语言中的数组

Go 的数组是 固定长度、同一类型 的一组数据,定义后长度不可改变,是一种值类型。

数组的声明方式

(1)声明时指定长度

Go 复制代码
var a [3]int

长度为 3,默认值全是 0。

(2)声明并初始化

Go 复制代码
b := [3]int{1, 2, 3}

(3)自动推断长度

使用 ...

Go 复制代码
c := [...]int{1, 2, 3, 4}

Go 编译器会自动计算长度为 4。

(4)指定索引初始化

Go 复制代码
d := [...]int{0: 100, 3: 300}

索引 0 的值为 100,索引 3 的值为 300,其他为 0。

数组的长度是类型的一部分

Go 复制代码
var a [3]int
var b [4]int

ab不同的类型,不能互相赋值。

数组是值类型(重点)

Go 的数组 赋值、传参都会 复制整个数组,而不是引用

Go 复制代码
func modify(x [3]int) {
    x[0] = 100
}

func main() {
    a := [3]int{1,2,3}
    modify(a)
    fmt.Println(a) // => [1 2 3]
}

原数组不会被修改。

如果想改变原数组,必须使用指针:

Go 复制代码
func modify(x *[3]int) {
    x[0] = 100
}

获取数组长度

Go 复制代码
len(a)

数组的遍历

Go 复制代码
for i, v := range a {
    fmt.Println(i, v)
}

或传统方式:

Go 复制代码
for i := 0; i < len(a); i++ {
    fmt.Println(a[i])
}

多维数组

Go 支持多维数组:

Go 复制代码
var m [2][3]int

初始化:

Go 复制代码
matrix := [2][3]int{
 {1, 2, 3}, 
 {4, 5, 6}, 
}

数组 vs 切片(slice)区别

这是实际开发最重要的部分:

数组(array)

  • 长度固定

  • 值类型

  • 很少直接使用

切片(slice)

  • 底层基于数组

  • 长度可变

  • 引用类型(类似动态数组)

  • Go 日常开发使用频率远高于数组

简单理解:

数组更像底层结构,切片才是 Go 主力容器。

示例:切片是引用类型,修改会影响原数据:

Go 复制代码
s := []int{1,2,3}
s[0] = 100

数组的典型使用场景

虽然数组不常单独使用,但以下情况很常见:

用在固定长度的数据结构

例如:

  • IPv4 地址 [4]byte

  • MD5 哈希 [16]byte

  • SHA256 哈希 [32]byte

做底层性能优化(少变更、固定大小)

总结表

项目 数组 Array 切片 Slice
长度 固定 可变
类型 值类型 引用类型
内存分配 整块分配 指向底层数组
赋值/传参 拷贝整个数据 拷贝指针,指向同一底层数据
使用频率 较低 极高
相关推荐
fy1216321 小时前
GO 快速升级Go版本
开发语言·redis·golang
童话ing1 天前
【Golang】Golang Map数据结构底层原理
数据结构·golang·哈希算法
GDAL1 天前
go.mod 文件讲解
golang·go.mod
Java面试题总结1 天前
Go图像处理基础: image包深度指南
图像处理·算法·golang
robch1 天前
golang container/heap 是一个为任意类型实现堆(优先队列)接口的包
数据结构·算法·golang
leonkay2 天前
Golang语言闭包完全指南
开发语言·数据结构·后端·算法·架构·golang
echome8882 天前
Go 语言并发编程实战:用 Goroutine 和 Channel 构建高性能任务调度器
开发语言·后端·golang
yuanlaile2 天前
2026后端趋势:Java 老了?Go 才是未来?
java·后端·golang·go与java·后端学什么
Mr -老鬼2 天前
Go存储架构选型实战:单库、双库还是多库?——基于核心元数据+动态表场景的技术解析
大数据·架构·golang
ithadoop2 天前
go面试知识点分类整理
golang·go