Go 语言中的数组:声明、初始化与应用

Go 语言的数据结构中,数组是一个基本的构成元素,它能存储一系列固定长度的项,这些项具有相同的类型。尽管在 Go 中切片的使用更为普遍,数组仍然是理解更高级数据结构如切片和map的基础。本文将详细探讨 Go 语言中数组的声明、初始化和相关操作,以及它们在内存中的表现。


文章目录


1、数组基础

1.1、数组简介

在 Go 语言中,数组是一个具有固定长度和类型的数据项序列。数组的长度被定义为类型的一部分,因此[5]int和[10]int被视为不同的类型。数组在声明时会根据指定的顺序进行初始化,每个元素默认为其类型的零值。

1.2、声明数组

数组的声明遵循以下格式:

go 复制代码
var identifier [len]type

例如,声明一个整型数组:

go 复制代码
var arr1 [5]int
1.3、数组在内存中的结构

在内存中,数组的每个元素都连续存储。当声明一个数组,如var arr1 [5]int,其所有元素默认初始化为0。数组的长度是固定的,并且必须在编译时确定,以便系统分配内存。


2、数组操作

2.1、遍历数组

数组的遍历通常通过索引完成,使用for循环是最常见的方法:

go 复制代码
package main
import "fmt"

func main() {
    var arr1 [5]int

    // 初始化数组
    for i := 0; i < len(arr1); i++ {
        arr1[i] = i * 2
    }

    // 打印数组
    for i := 0; i < len(arr1); i++ {
        fmt.Printf("Array at index %d is %d\n", i, arr1[i])
    }
}

输出示例:

复制代码
Array at index 0 is 0
Array at index 1 is 2
Array at index 2 is 4
Array at index 3 is 6
Array at index 4 is 8
2.2、初始化数组

如果数组的值已知,可以使用数组字面量进行初始化:

go 复制代码
var arrAge = [5]int{18, 20, 15, 22, 16}
var arrKeyValue = [5]string{3: "Chris", 4: "Ron"}

使用key: value语法可以指定特定索引的值,未指定的索引将使用类型的零值。


3、多维数组

Go 语言支持多维数组,例如:

go 复制代码
var matrix [3][5]int

这表示一个3行5列的二维整型数组。多维数组在Go中是矩形的,每个维度的长度必须相同。


4、将数组传递给函数

在 Go 中,直接传递一个大数组到函数通常不是性能最优的选择,因为这会涉及到拷贝整个数组的成本。更常见的做法是:

  • 传递数组的指针
  • 使用切片,这是更常见的做法

以下是通过传递数组指针的示例:

go 复制代码
package main
import "fmt"

func main() {
    array := [3]float64{7.0, 8.5, 9.1}
    x := sum(&array)
    fmt.Printf("The sum of the array is: %f", x)
}

func sum(a *[3]float64) (sum float64) {
    for _, v := range a {
        sum += v
    }
    return
}

输出结果:

复制代码
The sum of the array is: 24.600000

虽然这种方法有效,但在 Go 中更推荐使用切片,因为切片提供了更多灵活性和强大的功能。

相关推荐
tachibana211 小时前
使用for range 的时候,它的地址会发生变化吗?
开发语言·后端·golang·go·语法
王中阳Go12 小时前
Go 后端转 AI:非科班怎么补?一张 3 列路线表(可保存)
开发语言·人工智能·后端·python·golang·大语言模型
for_ever_love__18 小时前
LangChain Agentic RAG:让 Agent 自己决定要不要检索、检索几次
人工智能·golang·langchain·rag·langgraph·agentic·自适应检索
谢亮_vipxieliang19 小时前
Go gRPC基础与实战
开发语言·后端·golang
徐小黑ACG20 小时前
Golang goroutine、通道、锁
开发语言·后端·golang
FfHUCisI1 天前
Go 性能分析工具 pprof:CPU、Heap 与 Goroutine 实战
数据库·golang
念何架构之路1 天前
go-grpc核心抽象接口
开发语言·后端·golang
小小龙学IT1 天前
etcd 深度解析:Go 分布式一致性 KV 存储与 Raft 共识实战
分布式·golang·etcd
谢亮_vipxieliang1 天前
Go Gin 中间件与参数验证:从入门到实战
中间件·golang·gin
microrain2 天前
同一个值,四个名字,四套口径:SagooIoT 属性上报链路的 Canonical 收敛
物联网·golang·开源·sagooiot