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
长度 固定 可变
类型 值类型 引用类型
内存分配 整块分配 指向底层数组
赋值/传参 拷贝整个数据 拷贝指针,指向同一底层数据
使用频率 较低 极高
相关推荐
小小龙学IT4 小时前
Go 语言后端开发:从并发模型到生产落地的工程实践
开发语言·后端·golang
oqX0Cazj24 小时前
2026超火Go-Zero实战:从架构原理到高并发接口落地,彻底解决接口超时、雪崩问题
开发语言·架构·golang
go不是csgo10 小时前
从0到1理解Go熔断器:sony/gobreaker 源码剖析 + 仿TikTok Feed 项目实战
开发语言·后端·golang
oqX0Cazj211 小时前
Go-Zero数据库事务实战:本地事务+失败自动回滚+生产避坑+简单分布式事务方案
数据库·分布式·golang
右耳朵猫AI11 小时前
Go周刊2026W22 | GoReleaser 2.16、chi 5.3、tldx 1.4、wazero 1.12、Buf 1.70
开发语言·后端·golang
踏着七彩祥云的小丑11 小时前
Go学习第3天:变量+常量+运算符
开发语言·学习·golang·go
晨曦中的暮雨1 天前
Golang速通(Javaer版)
java·开发语言·后端·golang
codeejun1 天前
每日一Go-76(架构篇)|多集群部署 / 容灾 / Failover / Backup / 热迁移
开发语言·架构·golang
迷茫运维路1 天前
golang_Viper配置管理器
后端·golang
geovindu1 天前
go: Broadcast Pattern
开发语言·后端·设计模式·golang·广播模式