Go语言中的数组

简介: 在 Go 语言中,数组是一种固定长度的、相同类型元素的序列。数组声明时长度已确定,不可改变,支持多种初始化方式,如使用 `var` 关键字、短变量声明、省略号 `...` 推断长度等。数组内存布局连续,可通过索引高效访问。遍历数组常用 `for` 循环和 `range` 关键字。

基本概念

在 Go 语言中,数组(Array)是一种固定长度的、相同类型的元素序列。数组的长度在声明时就已经确定,并且不能改变。数组的每个元素可以通过索引访问,索引从 0 开始。

数组的声明和初始化:

在 Go 语言中,数组的声明和初始化有多种方式,以下是几种常见的方式:

1. 声明并初始化数组

方式一:使用 var 关键字声明并初始化

csharp

代码解读

复制代码

var arr [5]int = [5]int{1, 2, 3, 4, 5}

方式二:使用短变量声明并初始化

go

代码解读

复制代码

arr := [5]int{1, 2, 3, 4, 5}

2. 声明数组但不初始化

csharp

代码解读

复制代码

var arr [5]int

这种方式声明的数组,所有元素会被初始化为该类型的零值(例如,int 类型的零值是 0)。

3. 使用省略号 ... 自动推断数组长度

go

代码解读

复制代码

arr := [...]int{1, 2, 3, 4, 5}

这种方式会根据初始化列表中的元素个数自动推断数组的长度。

4. 部分初始化数组

go

代码解读

复制代码

arr := [5]int{1, 2}

这种方式会初始化前两个元素为 12,其余元素会被初始化为零值。

5. 指定索引初始化数组

css

代码解读

复制代码

arr := [5]int{0: 1, 4: 5}

这种方式会初始化索引为 0 的元素为 1,索引为 4 的元素为 5,其余元素会被初始化为零值。

6. 多维数组的声明和初始化

less

代码解读

复制代码

var arr [2][3]int
arr := [2][3]int{{1, 2, 3}, {4, 5, 6}}

多维数组的声明和初始化与一维数组类似,只是嵌套了更多的维度。

示例代码:

go

代码解读

复制代码

package main

import "fmt"

func main() {
    // 方式一:使用 var 关键字声明并初始化
    var arr1 [5]int = [5]int{1, 2, 3, 4, 5}
    fmt.Println(arr1)

    // 方式二:使用短变量声明并初始化
    arr2 := [5]int{1, 2, 3, 4, 5}
    fmt.Println(arr2)

    // 方式三:声明数组但不初始化
    var arr3 [5]int
    fmt.Println(arr3)

    // 方式四:使用省略号自动推断数组长度
    arr4 := [...]int{1, 2, 3, 4, 5}
    fmt.Println(arr4)

    // 方式五:部分初始化数组
    arr5 := [5]int{1, 2}
    fmt.Println(arr5)

    // 方式六:指定索引初始化数组
    arr6 := [5]int{0: 1, 4: 5}
    fmt.Println(arr6)

    // 方式七:多维数组的声明和初始化
    var arr7 [2][3]int
    arr8 := [2][3]int{{1, 2, 3}, {4, 5, 6}}
    fmt.Println(arr7)
    fmt.Println(arr8)
}

数组的内存分析:

在 Go 语言中,数组的内存分配和布局相对简单且直观。数组是一个固定长度的、相同类型的元素序列,其内存布局是连续的。

1. 内存分配

当声明一个数组时,Go 语言会在内存中分配一块连续的内存区域,用于存储数组的元素。数组的长度在声明时就已经确定,并且不能改变。

例如,声明一个包含 5 个整数的数组:

csharp

代码解读

复制代码

var arr [5]int

在这个例子中,Go 语言会在内存中分配一块连续的内存区域,大小为 5 * sizeof(int) 字节。假设 int 类型在当前平台上占用 4 个字节,那么这块内存区域的大小就是 5 * 4 = 20 字节。

2. 内存布局

数组的内存布局是线性的,即数组的每个元素在内存中是连续存储的。数组的第一个元素存储在内存的起始位置,第二个元素紧随其后,依此类推。

例如,对于数组 arr := [5]int{1, 2, 3, 4, 5},其内存布局如下:

css

代码解读

复制代码

内存地址:  |  arr[0]  |  arr[1]  |  arr[2]  |  arr[3]  |  arr[4]  |
值:       |    1     |    2     |    3     |    4     |    5     |

每个元素的内存地址可以通过数组的基地址(即数组的第一个元素的地址)加上元素的索引和元素类型的大小来计算。

3. 访问数组元素

由于数组的内存布局是连续的,访问数组元素非常高效。通过索引访问数组元素时,Go 语言会直接计算出该元素的内存地址,并从该地址读取或写入数据。

例如,访问数组 arr 的第三个元素:

go

代码解读

复制代码

value := arr[2]

Go 语言会计算出 arr[2] 的内存地址为 arr 的基地址加上 2 * sizeof(int) 字节,然后从该地址读取数据。

4. 数组的传递

在 Go 语言中,数组是值类型,这意味着当数组作为参数传递给函数时,会进行一次完整的复制。如果数组很大,这可能会导致性能问题。

例如:

go

代码解读

复制代码

func modifyArray(arr [5]int) {
    arr[0] = 100
}

func main() {
    arr := [5]int{1, 2, 3, 4, 5}
    modifyArray(arr)
    fmt.Println(arr)  // 输出: [1 2 3 4 5]
}

在这个例子中,modifyArray 函数接收的是 arr 的一个副本,因此修改副本不会影响原始数组。

数组的遍历:

在 Go 语言中,遍历数组有多种方式,常用的方法包括使用 for 循环和 range 关键字。以下是几种常见的遍历数组的方法:

1. 使用 for 循环和索引遍历数组

这是最基本的遍历方式,通过索引访问数组的每个元素。

go

代码解读

复制代码

package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5}

    for i := 0; i < len(arr); i++ {
        fmt.Println(arr[i])
    }
}

2. 使用 range 关键字遍历数组

range 关键字可以方便地遍历数组,它会返回索引和对应的元素值。

go

代码解读

复制代码

package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5}

    for index, value := range arr {
        fmt.Printf("Index: %d, Value: %d\n", index, value)
    }
}

3. 只使用 range 遍历数组的值

如果你只关心数组的值而不关心索引,可以使用 _ 忽略索引。

go

代码解读

复制代码

package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5}

    for _, value := range arr {
        fmt.Println(value)
    }
}

4. 只使用 range 遍历数组的索引

如果你只关心数组的索引而不关心值,可以只使用索引。

go

代码解读

复制代码

package main

import "fmt"

func main() {
    arr := [5]int{1, 2, 3, 4, 5}

    for index := range arr {
        fmt.Println(index)
    }
}

5. 使用 for 循环和 range 遍历多维数组

对于多维数组,可以嵌套使用 for 循环和 range 关键字。

css

代码解读

复制代码

package main

import "fmt"

func main() {
    arr := [2][3]int{{1, 2, 3}, {4, 5, 6}}

    for i := 0; i < len(arr); i++ {
        for j := 0; j < len(arr[i]); j++ {
            fmt.Printf("arr[%d][%d] = %d\n", i, j, arr[i][j])
        }
    }

    // 使用 range 遍历多维数组
    for i, row := range arr {
        for j, value := range row {
            fmt.Printf("arr[%d][%d] = %d\n", i, j, value)
        }
    }
}


转载来源:https://juejin.cn/post/7428200842228547625

相关文章
|
4天前
|
SQL 人工智能 安全
【灵码助力安全1】——利用通义灵码辅助快速代码审计的最佳实践
本文介绍了作者在数据安全比赛中遇到的一个开源框架的代码审计过程。作者使用了多种工具,特别是“通义灵码”,帮助发现了多个高危漏洞,包括路径遍历、文件上传、目录删除、SQL注入和XSS漏洞。文章详细描述了如何利用这些工具进行漏洞定位和验证,并分享了使用“通义灵码”的心得和体验。最后,作者总结了AI在代码审计中的优势和不足,并展望了未来的发展方向。
|
13天前
|
存储 弹性计算 人工智能
阿里云Alex Chen:普惠计算服务,助力企业创新
本文整理自阿里云弹性计算产品线、存储产品线产品负责人陈起鲲(Alex Chen)在2024云栖大会「弹性计算专场-普惠计算服务,助力企业创新」中的分享。在演讲中,他分享了阿里云弹性计算,如何帮助千行百业的客户在多样化的业务环境和不同的计算能力需求下,实现了成本降低和效率提升的实际案例。同时,基于全面升级的CIPU2.0技术,弹性计算全线产品的性能、稳定性等关键指标得到了全面升级。此外,他还宣布了弹性计算包括:通用计算、加速计算和容器计算的全新产品家族,旨在加速AI与云计算的融合,推动客户的业务创新。
|
11天前
|
编解码 Java 程序员
写代码还有专业的编程显示器?
写代码已经十个年头了, 一直都是习惯直接用一台Mac电脑写代码 偶尔接一个显示器, 但是可能因为公司配的显示器不怎么样, 还要接转接头 搞得桌面杂乱无章,分辨率也低,感觉屏幕还是Mac自带的看着舒服
|
18天前
|
存储 人工智能 缓存
AI助理直击要害,从繁复中提炼精华——使用CDN加速访问OSS存储的图片
本案例介绍如何利用AI助理快速实现OSS存储的图片接入CDN,以加速图片访问。通过AI助理提炼关键操作步骤,避免在复杂文档中寻找解决方案。主要步骤包括开通CDN、添加加速域名、配置CNAME等。实测显示,接入CDN后图片加载时间显著缩短,验证了加速效果。此方法大幅提高了操作效率,降低了学习成本。
3099 10
|
13天前
|
存储 缓存 关系型数据库
MySQL事务日志-Redo Log工作原理分析
事务的隔离性和原子性分别通过锁和事务日志实现,而持久性则依赖于事务日志中的`Redo Log`。在MySQL中,`Redo Log`确保已提交事务的数据能持久保存,即使系统崩溃也能通过重做日志恢复数据。其工作原理是记录数据在内存中的更改,待事务提交时写入磁盘。此外,`Redo Log`采用简单的物理日志格式和高效的顺序IO,确保快速提交。通过不同的落盘策略,可在性能和安全性之间做出权衡。
1578 12
|
5天前
|
人工智能 关系型数据库 Serverless
1024,致开发者们——希望和你一起用技术人独有的方式,庆祝你的主场
阿里云开发者社区推出“1024·云上见”程序员节专题活动,包括云上实操、开发者测评和征文三个分会场,提供14个实操活动、3个解决方案、3 个产品方案的测评及征文比赛,旨在帮助开发者提升技能、分享经验,共筑技术梦想。
772 102
|
1月前
|
弹性计算 人工智能 架构师
阿里云携手Altair共拓云上工业仿真新机遇
2024年9月12日,「2024 Altair 技术大会杭州站」成功召开,阿里云弹性计算产品运营与生态负责人何川,与Altair中国技术总监赵阳在会上联合发布了最新的“云上CAE一体机”。
阿里云携手Altair共拓云上工业仿真新机遇
|
18天前
|
人工智能 Serverless API
AI助理精准匹配,为您推荐方案——如何快速在网站上增加一个AI助手
通过向AI助理提问的方式,生成一个技术方案:在网站上增加一个AI助手,提供7*24的全天候服务,即时回答用户的问题和解决他们可能遇到的问题,无需等待人工客服上班,显著提升用户体验。
1520 9
|
6天前
|
SQL 存储 人工智能
【产品升级】Dataphin V4.3重大升级:AI“弄潮儿”,数据资产智能化
DataAgent如何助理业务和研发成为业务参谋?如何快速低成本的创建行业数据分类标准?如何管控数据源表的访问权限?如何满足企业安全审计需求?
388 0
【产品升级】Dataphin V4.3重大升级:AI“弄潮儿”,数据资产智能化
|
3天前
|
人工智能 自然语言处理 程序员
提交通义灵码创新实践文章,重磅好礼只等你来!
通义灵码创新实践征集赛正式开启,发布征文有机会获得重磅好礼+流量福利,快来参加吧!
212 7