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

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

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

在 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) 代替数组。

适用于:

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

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

相关推荐

每天一个AI姬,AMD核显用户有福了,AI绘画打破 NVIDIA 显卡垄断

使用StableDiffusion进行AI绘画,并不一定只能使用NVIDIA英伟达显卡,甚至,也不一定只能使用独立显卡。今天我们使用AMD6800H核显,并安装了StableDif...

NETworkManager:功能强大的网络管理与问题排除工具

关于NETworkManagerNETworkManager是一款功能强大的网络管理与问题排除工具,该工具完全开源,可以帮助广大研究人员轻松管理目标网络系统并排除网络疑难问题。该工具使用远程桌面、Po...

AMD也能深度学习+免费AI绘画:StableDiffusion+ROCm部署教程!

某国政客扇扇嘴皮子,CN玩硬件和深度学习的圈子里就掀起了一场风暴,这就是著名的嘴皮子效应(误)。没了高性能计算的A100H100倒也能理解,但是美利坚这波把RTX4090禁售了就让人无语了,所以不少做...

windows 下编译 python_rtmpstream

最近在研究数字人,看了大咖的项目(https://github.com/lipku/metahuman-stream),尝试编译此项目的依赖项目python_rtmpstream(https://gi...

如何使用 Python 操作 Git 代码?GitPython 入门介绍

花下猫语:今天,我在查阅如何用Python操作Gitlab的时候,看到这篇文章,觉得还不错,特分享给大家。文中还提到了其它几种操作Git的方法,后续有机会的话,再陆续分享之~~作者:匿蟒...

网上看了不少,终于把ZlmediaKit流媒体框架搭建起来啦

你都站在2023年代了,视频通话、视频直播、视频会议、视频监控就是风口浪尖上的猪师兄,只要你学那么一丁点,拿个高薪的工作不过分吧!我也是半瓶子晃荡的,所以路人呀,共学习,同进步!本篇开始,只讲在Lin...

MacDown:一款 macOS 的强大 Markdown 编辑器

大家好,很高兴又见面了,我是"...

ZLMediaKit安装配置和推拉流

一、ZLMediaKit库简介ZLMediaKit是一个基于...

大神赞过的:学习 WebAssembly 汇编语言程序设计

文/阿里淘系F(x)Team-旭伦随着前端页面变得越来越复杂,javascript的性能问题一再被诟病。而Javascript设计时就不是为了性能优化设计的,这使得浏览器上可以运行的本地语言一...

【Docker】部署WVP视频监控平台

回来Docker系列,今天将会跟大家分享一则关于开源WVP视频监控平台的搭建。先说结论吧,一开始按照网上说的一步一步搭建没有搭建成功,不知道是版本太旧还是我这边机器有问题,尝试了好几个不同方式的搭建都...

MongoDB+GridFS存储文件方案

GridFS是MongoDB的一个内置功能,它提供一组文件操作的API以利用MongoDB存储文件,GridFS的基本原理是将文件保存在两个Collection中,一个保存文件索引,一个保存文...

【开源】强大、创新且直观的 EDA套件

今天分享的LibrePCB是...

Ollama如何制作自己的大模型?

背景Llama3发布了,这次用了...

Ollama使用指南【超全版】

一、Ollama快速入门Ollama是一个用于在本地运行大型语言模型的工具,下面将介绍如何在不同操作系统上安装和使用Ollama。官网:https://ollama.comGithub:http...

基于区块链的价值共享互联网即时通讯应用平台源码免费分享

——————关注转发之后私信回复【源码】即可免费获取到本项目所有源码基于区块链的价值共享互联网即时通讯应用平台,是一个去中心化的任何人都可以使用的通讯网络,是一款基于区块链的价值共享互联网即时通讯AP...