百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

Go语言-数组(go语言数组长度)

wptr33 2025-03-20 20:08 18 浏览

在 Go 语言(Golang)中,数组(Array) 是一种固定长度的数据结构,它存储类型相同的元素。数组的长度在定义时就确定,无法改变。以下是 Go 语言中数组的基本用法和特点:


1.数组声明与初始化

(1) 基本声明

var arr [5]int  // 声明一个包含 5 个整数的数组,默认值为 0

(2) 直接初始化

arr := [5]int{1, 2, 3, 4, 5}  // 声明并初始化

(3) 省略长度(自动推导)

arr := [...]int{1, 2, 3, 4, 5}  // Go 自动推导数组长度

(4) 指定索引初始化

arr := [5]int{1: 10, 3: 20}  // 仅初始化索引 1 和 3,其余默认为 0
fmt.Println(arr)  // 输出: [0 10 0 20 0]

2.访问数组元素

arr := [3]int{10, 20, 30}
fmt.Println(arr[0])  // 访问第一个元素
arr[1] = 50          // 修改第二个元素
fmt.Println(arr)     // 输出: [10 50 30]

3.数组的长度

使用 len() 获取数组长度:

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

4.遍历数组

(1) 传统for循环

arr := [3]int{10, 20, 30}
for i := 0; i < len(arr); i++ {
    fmt.Println(arr[i])
}

(2) 使用range遍历

arr := [3]int{10, 20, 30}
for index, value := range arr {
    fmt.Printf("索引 %d: 值 %d\n", index, value)
}

5.数组是值类型

在 Go 语言中,数组是 值类型,意味着赋值或传递时,会 复制整个数组,而不是传递引用:

func modifyArray(arr [3]int) {
    arr[0] = 100  // 仅修改副本
}

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

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

func modifyArray(arr *[3]int) {
    arr[0] = 100  // 修改原数组
}

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

6.多维数组

(1) 声明与初始化

var matrix [2][3]int  // 2 行 3 列的二维数组

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

(2) 访问多维数组

fmt.Println(matrix[0][1])  // 访问第一行第二个元素(输出: 2)

(3) 遍历多维数组

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

7.数组 vs 切片(slice)

Go 语言的 数组 长度固定,而 切片(slice) 是动态的、可变的,更常用。与数组不同,切片是 引用类型,共享底层数据:

arr := [5]int{1, 2, 3, 4, 5}
slice := arr[1:4]  // 创建切片 [2 3 4]
fmt.Println(slice)

如果需要灵活的数据结构,通常使用切片而不是数组。


总结

  • 数组长度固定,声明后不可更改。
  • 数组是值类型,赋值和函数传递时会复制整个数组。
  • 可以使用 for 或 range 遍历数组。
  • 多维数组可以嵌套,但不如切片灵活。
  • Go 语言更推荐使用 切片(slice) 代替数组。

适用于:

  • 固定大小的数据存储(如棋盘、矩阵)。
  • 需要避免额外的切片开销的高性能场景。

如果你的数据长度是动态的,建议使用 切片 代替数组!

相关推荐

redis的八种使用场景

前言:redis是我们工作开发中,经常要打交道的,下面对redis的使用场景做总结介绍也是对redis举报的功能做梳理。缓存Redis最常见的用途是作为缓存,用于加速应用程序的响应速度。...

基于Redis的3种分布式ID生成策略

在分布式系统设计中,全局唯一ID是一个基础而关键的组件。随着业务规模扩大和系统架构向微服务演进,传统的单机自增ID已无法满足需求。高并发、高可用的分布式ID生成方案成为构建可靠分布式系统的必要条件。R...

基于OpenWrt系统路由器的模式切换与网页设计

摘要:目前商用WiFi路由器已应用到多个领域,商家通过给用户提供一个稳定免费WiFi热点达到吸引客户、提升服务的目标。传统路由器自带的Luci界面提供了工厂模式的Web界面,用户可通过该界面配置路...

这篇文章教你看明白 nginx-ingress 控制器

主机nginx一般nginx做主机反向代理(网关)有以下配置...

如何用redis实现注册中心

一句话总结使用Redis实现注册中心:服务注册...

爱可可老师24小时热门分享(2020.5.10)

No1.看自己以前写的代码是种什么体验?No2.DooM-chip!国外网友SylvainLefebvre自制的无CPU、无操作码、无指令计数器...No3.我认为CS学位可以更好,如...

Apportable:拯救程序员,IOS一秒变安卓

摘要:还在为了跨平台使用cocos2d-x吗,拯救objc程序员的奇葩来了,ApportableSDK:FreeAndroidsupportforcocos2d-iPhone。App...

JAVA实现超买超卖方案汇总,那个最适合你,一篇文章彻底讲透

以下是几种Java实现超买超卖问题的核心解决方案及代码示例,针对高并发场景下的库存扣减问题:方案一:Redis原子操作+Lua脚本(推荐)//使用Redis+Lua保证原子性publicbo...

3月26日更新 快速施法自动施法可独立设置

2016年3月26日DOTA2有一个79.6MB的更新主要是针对自动施法和快速施法的调整本来内容不多不少朋友都有自动施法和快速施法的困扰英文更新日志一些视觉BUG修复就不翻译了主要翻译自动施...

Redis 是如何提供服务的

在刚刚接触Redis的时候,最想要知道的是一个’setnameJhon’命令到达Redis服务器的时候,它是如何返回’OK’的?里面命令处理的流程如何,具体细节怎么样?你一定有问过自己...

lua _G、_VERSION使用

到这里我们已经把lua基础库中的函数介绍完了,除了函数外基础库中还有两个常量,一个是_G,另一个是_VERSION。_G是基础库本身,指向自己,这个变量很有意思,可以无限引用自己,最后得到的还是自己,...

China&#39;s top diplomat to chair third China-Pacific Island countries foreign ministers&#39; meeting

BEIJING,May21(Xinhua)--ChineseForeignMinisterWangYi,alsoamemberofthePoliticalBureau...

移动工作交流工具Lua推出Insights数据分析产品

Lua是一个适用于各种职业人士的移动交流平台,它在今天推出了一项叫做Insights的全新功能。Insights是一个数据平台,客户可以在上面实时看到员工之间的交流情况,并分析这些情况对公司发展的影响...

Redis 7新武器:用Redis Stack实现向量搜索的极限压测

当传统关系型数据库还在为向量相似度搜索的性能挣扎时,Redis7的RedisStack...

Nginx/OpenResty详解,Nginx Lua编程,重定向与内部子请求

重定向与内部子请求Nginx的rewrite指令不仅可以在Nginx内部的server、location之间进行跳转,还可以进行外部链接的重定向。通过ngx_lua模块的Lua函数除了能实现Nginx...