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
长度 固定 可变
类型 值类型 引用类型
内存分配 整块分配 指向底层数组
赋值/传参 拷贝整个数据 拷贝指针,指向同一底层数据
使用频率 较低 极高
相关推荐
DICOM医学影像10 小时前
15. Go-Ethereum测试Solidity ERC20合约 - Go-Ethereum调用合约方法
开发语言·后端·golang·区块链·智能合约·以太坊·web3.0
我要用代码向我喜欢的女孩表白11 小时前
对象存储路径文件1TB以上文件比对,go语言
ios·golang·xcode
巴塞罗那的风14 小时前
golang协程泄漏排查实战
开发语言·后端·golang
DYS_房东的猫15 小时前
学习总结笔记三:让网站“活”起来——处理静态文件、表单验证与用户登录(第3章实战版)
笔记·学习·golang
怪我冷i15 小时前
GORM 的 Migration API
数据库·postgresql·golang·ai编程·ai写作
迷途的小子16 小时前
go-gin binding 标签详解
java·golang·gin
molaifeng17 小时前
硬核拆解 Go GC 演进史——从 STW 到亚毫秒延迟
开发语言·后端·golang
未来之窗软件服务17 小时前
幽冥大陆(八十一)安检原理识别管制刀具原理go语言—东方仙盟练气期
开发语言·后端·golang·安检系统
Object~17 小时前
1.golang项目结构
开发语言·后端·golang
DICOM医学影像17 小时前
14. Go-Ethereum测试Solidity ERC20合约 - Go-Ethereum调用区块链方法
开发语言·golang·go·区块链·solidity·以太坊·go-ethereum