GO语言---数组

文章目录

数组是Go语言中最基本的数据结构之一,它是一组相同类型元素的固定长度序列。

数组的基本特性

1、固定长度:数组的长度在声明时确定,不可改变。

2、相同类型:所有元素必须是同一类型。

3、连续内存:元素在内存中是连续存储的。

4、值类型:数组是值类型,赋值或传参会复制整个数组。

数组的声明和初始化

bash 复制代码
// 声明一个包含5个int的数组,初始化为零值
// 零值初始化
var a [5]int

//  字面量初始化
var b = [3]int{1, 2, 3}
c := [4]string{"a", "b", "c", "d"}

// 使用...让编译器计算数组长度 长度为5
// 索引初始化
e := [...]int{1, 2, 3, 4, 5}

// 指定索引位置初始化,未指定的为零值
// 自动长度推断初始化
d := [5]int{1: 10, 3: 30}
// 结果为 [0, 10, 0, 30, 0]

数组元素的访问和操作

bash 复制代码
arr := [3]int{10, 20, 30}

// 通过索引访问
first := arr[0]  // 10
second := arr[1] // 20

// 修改元素
arr[2] = 40

数组遍历

方法1:

使用for循环索引遍历

bash 复制代码
// 使用for循环
for i := 0; i < len(arr); i++ {
    fmt.Println(arr[i])
}

方法2:

使用range关键字遍历

bash 复制代码
arr := [5]string{"Apple", "Banana", "Orange", "Grape", "Pear"}

// range遍历,获取索引和值
for index, value := range arr {
    fmt.Printf("索引:%d 值:%s\n", index, value)
}

// 只需要值时
for _, value := range arr {
    fmt.Println("值:", value)
}

// 只需要索引时
for index := range arr {
    fmt.Println("索引:", index)
}

多维数组

二维数组的声明和初始化:

bash 复制代码
// 声明二维数组
var matrix [3][3]int

// 初始化二维数组
matrix = [3][3]int{
    {1, 2, 3},
    {4, 5, 6},
    {7, 8, 9},
}

// 访问元素
val := matrix[1][2] // 6

数组的长度和容量

数组的长度是固定的,可以使用内置函数len()获取:

bash 复制代码
arr := [5]int{1, 2, 3, 4, 5}
length := len(arr) // 5

数组作为函数参数

数组是值类型,作为函数参数时会复制整个数组:

bash 复制代码
func modifyArray(arr [3]int) {
    arr[0] = 100
}

func main() {
    a := [3]int{1, 2, 3}
    modifyArray(a)
    fmt.Println(a) // 输出 [1 2 3],原数组未改变
}

如果需要修改原数组,可以使用指针:

bash 复制代码
func modifyArray(arr *[3]int) {
    arr[0] = 100
}

func main() {
    a := [3]int{1, 2, 3}
    modifyArray(&a)
    fmt.Println(a) // 输出 [100 2 3]
}

数组与切片的区别

特性 数组 切片
长度 固定 动态可变
类型 值类型 引用类型
声明方式 nT \[\]T
内存分配 栈或静态存储区
传递效率 低(复制整个数组) 高(只复制切片头)
大小 编译时确定 运行时动态变化

注意

1、长度固定,无法动态扩展。

2、作为值类型传递时会有性能开销(特别是大数组)。

3、缺乏灵活性。

相关推荐
傻啦嘿哟5 小时前
某招聘平台爬虫:爬取招聘岗位数据,分析各城市薪资水平
开发语言·爬虫·python
2501_933670795 小时前
2026秋招量化分析岗技能栈:Python、SQL、统计建模、回测项目怎么准备
开发语言·python·sql
Dola_Zou5 小时前
工厂智能排产软件算法保护与按产线计费实战
算法·自动化·软件工程·软件加密
李少兄6 小时前
JavaScript 数据类型完全指南
开发语言·javascript·ecmascript
Seoyoneh6 小时前
Agentic Workflow编排架构:云客服从“被动响应”迈向“主动执行”的技术实现
java·开发语言·架构
啦啦啦啦啦zzzz7 小时前
Logger的组装(c++20)
c++·算法·c++20
Tangyuewei7 小时前
Java 写 Agent:模型只是组件
java·开发语言
小玮看世界7 小时前
[Python]从合并区间到传感器融合区:合并区间在传感器区域融合的实际落地
开发语言·python
尾善爱看海8 小时前
前端算法与手写题集
前端·算法
繁星蓝雨8 小时前
C++的设计与演进大纲(如何从C语言一步步成长为C++)
c语言·开发语言·c++·c++历史·c++演进