【Go语言基础【15】】数组:固定长度的连续存储结构
文章目录
- 零、概述
- 一、数组基础
- 1、数组的本质:固定长度的连续存储结构
- 2、声明与初始化
- 3、访问与修改元素
- 二、数组拷贝与传参
- 1、 值拷贝特性
- 2、指针数组的拷贝
- 3、函数传参(值传递)
- 三、数组遍历
- 四、多维数组
- 五、数组与切片的区别
零、概述
数组核心语法速查表
操作 | 语法示例 | 说明 |
---|---|---|
声明数组 | var arr [5]int | 长度5,元素默认0 |
初始化数组 | arr := [3]string{"a", "b", "c"} | 完整初始化 |
自动推断长度 | arr := [...]int{1, 2, 3} | 长度为3 |
指定索引初始化 | arr := [4]int{0: 1, 2: 3} | 索引0→1,索引2→3,其余为0 |
访问元素 | value := arr[2] | 索引从0开始 |
遍历数组 | for i, v := range arr { ... } | 使用for range |
多维数组 | var matrix [2][3]float64 | 二维数组,2行3列 |
适用场景
- 需要固定长度的数据集合:如存储月份天数、矩阵数据。
- 性能敏感场景:连续内存结构适合缓存优化,访问速度快于切片。
- 值语义需求:需要确保数据拷贝时的独立性(如游戏棋盘状态)。
注意事项
- 越界检查:访问超出索引范围的元素会触发
panic
,需通过len(arr)
判断边界。- 大数组性能:拷贝大数组时性能较低,建议使用切片或指针传递。
- 类型一致性:数组长度和元素类型必须完全匹配才能赋值或比较。
一、数组基础
1、数组的本质:固定长度的连续存储结构
Go语言中的数组是值类型,具有以下核心特性:
- 固定长度:声明时必须指定长度,运行时不可增减(长度是类型的一部分,如
[5]int
和[6]int
是不同类型)。 - 连续内存:元素在内存中连续存放,支持高效的索引访问(时间复杂度O(1))。
- 类型统一:所有元素类型相同,可存储内置类型(如
int
、string
)或自定义类型(如结构体)。
内存结构示例
arr := [4]int{3, 1, 4, 1} // 长度为4的int数组
- 索引从0开始,每个元素占4字节(
int
在32位系统占4字节)。 - 内存地址连续,可通过
arr[i]
直接访问第i
个元素。
2、声明与初始化
** 基本声明语法**
var 数组名 [长度]类型 // 未初始化,元素为类型零值
var scores [5]float64 // 长度5的float64数组,默认值全为0
var names [3]string // 默认值全为空字符串""
初始化方式
(1)完整初始化
arr := [长度]类型{值1, 值2, ...} // 显式指定所有元素
primes := [3]int{2, 3, 5} // 长度3,元素为2、3、5
(2)自动推断长度(...
)
arr := [...]类型{值1, 值2, ...} // 长度由初始化值个数决定
fruits := [...]string{"apple", "banana", "orange"} // 长度3
(3)指定索引初始化
arr := [长度]类型{索引: 值, 索引: 值, ...} // 仅初始化指定索引的元素
points := [4]int{0: 10, 3: 20} // 索引0→10,索引3→20,其余为0
// 数组为:[10, 0, 0, 20]
3、访问与修改元素
索引访问
语法:数组名[索引]
,索引范围[0, 长度-1]
,越界会触发运行时panic
。
arr := [3]int{1, 2, 3}
fmt.Println(arr[0]) // 输出:1
arr[1] = 4 // 修改索引1的元素为4
指针数组
定义:元素为指针的数组,用于存储多个地址。
var ptrs [2]*int // 长度2的int指针数组
a, b := 10, 20
ptrs[0], ptrs[1] = &a, &b // 存储变量地址
fmt.Println(*ptrs[0]) // 输出:10
二、数组拷贝与传参
1、 值拷贝特性
数组是值类型,赋值或传参时会完整拷贝所有元素(包括指针数组中的指针值,但不拷贝指针指向的数据)。
arr1 := [2]int{1, 2}
arr2 := arr1 // 拷贝arr1的元素到arr2
arr1[0] = 100 // 修改arr1不影响arr2
fmt.Println(arr2[0]) // 输出:1(原拷贝值)
2、指针数组的拷贝
拷贝的是指针值(地址),若多个指针指向同一数据,修改会同步。
示例:
str := "hello"
ptrArr1 := [1]*string{&str}
ptrArr2 := ptrArr1 // 拷贝指针值(均指向str)
*ptrArr1[0] = "world" // 修改str,ptrArr2同步变化
fmt.Println(*ptrArr2[0]) // 输出:world
3、函数传参(值传递)
传递数组时,函数接收的是原数组的副本,修改副本不影响原始数组。
示例:
func modify(arr [3]int) {arr[0] = 100 // 修改副本
}
func main() {arr := [3]int{1, 2, 3}modify(arr) // 传递副本fmt.Println(arr[0]) // 输出:1(原始数组未改变)
}
三、数组遍历
for
循环遍历
arr := [3]string{"a", "b", "c"}
for i := 0; i < len(arr); i++ {fmt.Printf("索引%d: %s\n", i, arr[i])
}
for range
遍历
arr := [3]int{10, 20, 30}
for index, value := range arr {fmt.Printf("索引%d: 值%d\n", index, value)
}
// 输出:
// 索引0: 值10
// 索引1: 值20
// 索引2: 值30
四、多维数组
- 二维数组
// 声明:[外层长度][内层长度]类型
matrix := [2][3]int{{1, 2, 3}, {4, 5, 6}} // 2行3列
访问元素:matrix[行索引][列索引]
fmt.Println(matrix[0][2]) // 输出:3(第1行第3列)
- 三维数组
cube := [2][2][2]int{{{1, 2}, {3, 4}},{{5, 6}, {7, 8}},
}
五、数组与切片的区别
特性 | 数组(Array) | 切片(Slice) |
---|---|---|
长度 | 固定(声明时确定) | 动态(可扩容) |
类型 | 包含长度(如[5]int ) | 不包含长度(如[]int ) |
内存分配 | 连续内存,固定大小 | 底层依赖数组,可动态扩展 |
传参 | 值传递(拷贝所有元素) | 引用传递(仅拷贝切片头信息) |
注意:切片是数组的“视图”,通过arr[:]
可将数组转换为切片。
相关文章:
【Go语言基础【15】】数组:固定长度的连续存储结构
文章目录 零、概述一、数组基础1、数组的本质:固定长度的连续存储结构2、声明与初始化3、访问与修改元素 二、数组拷贝与传参1、 值拷贝特性2、指针数组的拷贝3、函数传参(值传递) 三、数组遍历四、多维数组五、数组与切片的区别 零、概述 数…...

【读论文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷积神经网络
摘要1 Introduction2 Network Architecture3 Training3.1 Data Augmentation 4 Experiments5 Conclusion背景知识卷积激活函数池化上采样、上池化、反卷积softmax 归一化函数交叉熵损失 Olaf Ronneberger, Philipp Fischer, Thomas Brox Paper:https://arxiv.org/ab…...
Komiko 视频到视频功能炸裂上线!
Komiko 平台作为行业的创新先锋,近日宣布推出全新的视频到视频(Video-to-Video)功能,这一举措犹如一颗重磅炸弹,瞬间在漫画、动画和插画创作的世界里掀起了惊涛骇浪,进一步巩固了其作为 AI 驱动的一体化创作…...

Linux 文件系统与 I/O 编程核心原理及实践笔记
文章目录 一、理解文件1.1 狭义理解1.2 广义理解1.3 文件操作的归类认识1.4 系统角度:进程与文件的交互1.5 实践示例 二、回顾 C 文件接口2.1 hello.c 打开文件2.2 hello.c 写文件2.3 hello.c 读文件2.4 输出信息到显示器的几种方法2.5 stdin & stdout & st…...

vite+tailwind封装组件库
前言 演示视频 https://www.bilibili.com/video/BV1EST3zPEyP/?spm_id_from333.1387.homepage.video_card.click 参考 https://juejin.cn/post/7112295067682865166 https://juejin.cn/post/7046187185615142949 代码仓库 https://gitee.com/malguy/vite-components-li…...
Gin框架实战指南:从入门到进阶
Gin框架实战指南:从入门到进阶 在当今的后端开发领域,Gin框架以其高性能、简洁易用的特点,赢得了众多Go语言开发者的青睐。本文将带你深入探索Gin框架的方方面面,从基础的安装与使用,到响应处理、请求参数解析、中间件…...

【Java学习笔记】包装类
包装类(Wrapper) 1. 介绍 (1)针对八种基本数据类型相应的引用类型 --> 包装类 (2)有了类的特点,就可以调用类中的方法 2. 分类和继承关系 基本数据类型包装类父类booleanBooleanObjectc…...

【高效开发工具系列】Blackmagic Disk Speed Test for Mac:专业硬盘测速工具
博客目录 一、Blackmagic Disk Speed Test 概述二、软件核心功能解析三、v3.3 版本的新特性与改进四、实际应用场景分析五、使用技巧与最佳实践六、与其他工具的比较及优势 一、Blackmagic Disk Speed Test 概述 Blackmagic Disk Speed Test 是 Mac 平台上广受专业人士青睐的一…...
QtDBus模块功能及架构解析
Qt 6.0 中的 QtDBus 模块是一个用于进程间通信(IPC)的核心模块,它基于 D-Bus 协议实现。D-Bus 是一种在 Linux 和其他类 Unix 系统上广泛使用的消息总线系统,允许应用程序和服务相互通信。 一、QtDBus模块主要功能: 1…...
光学字符识别(OCR)理论概述与实践教程
一、 光学字符识别(OCR)理论基础 OCR,即Optical Character Recognition,旨在通过计算机视觉和模式识别技术,将图像中包含的文本信息转换为机器可编辑、可搜索的文本数据。这项技术是实现信息数字化、自动化处理纸质或图像化文档的关键。 1. OCR处理管线 OCR系统通常采用…...
关键字--sizeof
sizeof 是 C 中的一个编译时运算符,用于获取一个类型或对象在内存中所占的字节数(单位:字节,byte)。 用法 获取类型的大小: std::cout << sizeof(int) << std::endl; // 输出int类型的字节数…...
Ubuntu20.04启动python的虚拟环境
如果你使用 mkvirtualenv 来创建虚拟环境,说明你已经安装了 virtualenvwrapper,这是一个用于管理 Python 虚拟环境的工具。 激活虚拟环境 要激活你使用 mkvirtualenv 创建的虚拟环境,按照以下步骤操作: 1.确保已经安装了 virtu…...
网页在线客服系统自动欢迎语实现方案(PHP+MySQL)
一、实现思路 在网页在线客服系统中实现自动欢迎语,主要需要以下几个步骤: 在数据库中存储欢迎语内容判断用户是否为首次访问或新会话在适当时机自动发送欢迎消息 演示网站:gofly.v1kf.com 二、数据库设计 首先需要扩展数据库结构:…...

UniRig:如何在矩池云一站式解决 3D 模型绑定难题
在 3D 动画制作中,绑定(Rigging)是一个至关重要但复杂耗时的步骤。它包括为 3D 模型创建骨架并分配蒙皮权重,以实现流畅的动画效果。由清华大学与 Tripo 联合开发的 UniRig 框架,为这一难题提供了全新的解决方案。 什…...
用函数实现模块化程序设计(适合考研、专升本)
函数 定义:本质上是一段可以被连续调用、功能相对独立的程序段 c语言是通过“函数”实现模块化的。根据分类标准不同函数分为以下几类。 用户角度:库函数、自定义函数 函数形式:有参函数、无参函数 作用域:外部函数、内部函数 …...
玩转抖音矩阵:核心玩法与高效运营规则
一、 抖音矩阵:流量协同的生态网络 抖音矩阵,本质是运营一个相互关联、互相支持的抖音账号群。核心目标在于通过账号间的深度协同(内容、流量、粉丝),打破单个账号的流量天花板,实现11>2的效果。它不仅…...
spring:继承接口FactoryBean获取bean实例
spring框架提供接口FactoryBean获取bean实例。 实现步骤: 实现接口FactoryBean。 在xml文件中配置实现接口FactoryBean的类。 调用接口FactoryBean中方法getObject,获取bean实例。 实现接口类 package com.itheima.factory;import org.springframework…...

字符串字典序最大后缀问题详解
字符串字典序最大后缀问题详解 一、问题定义与背景1.1 问题描述1.2 实际应用场景 二、暴力解法及其局限性2.1 暴力解法思路2.2 代码示例2.3 局限性分析 三、双指针算法:高效解决方案3.1 算法核心思想3.2 算法步骤3.3 代码实现3.4 与暴力解法对比 四、复杂度分析4.1 …...

VScode打开后一直显示正在重新激活终端 问题的解决方法
一、问题 本人打开“.py”文件后,同时会出现以下两个问题。 1、VScode一直循环在”正在重新激活终端“ 2、日志显示intellicode报错: Sorry, something went wrong activating IntelliCode support for Python. Please check the “Python” and “VS I…...

pe文件结构(TLS)
TLS 什么是TLS? TLS是 Thread Local Storage 的缩写,线程局部存储。主要是为了解决多线程中变量同步的问题 如果需要要一个线程内部的各个函数调用都能访问,但其它线程不能访问的变量(被称为static memory local to a thread 线程局部静态变…...
二进制安全-OpenWrt-uBus
1 需求 需求:ubus list 需求:ubus -v list 需求:ubus -v list zwrt_router.api 2 接口 rootOpenWrt:/# ubus Usage: ubus [<options>] <command> [arguments...] Options:-s <socket>: Set the unix domain …...
分页查询的实现
第一步:导入pom依赖 <!--配置PageHelper分页插件--><dependency><groupId>com.github.pagehelper</groupId><artifactId>pagehelper-spring-boot-starter</artifactId><version>1.4.6</version><exclusions>…...

中型零售业数据库抉择:MySQL省成本,SQL SERVER?
针对中型零售企业(20台固定POS数十台移动POS,含库存管理与结算业务)的操作系统与数据库选型,需平衡性能、成本、扩展性及运维效率。结合行业实践与系统需求,建议如下: 🖥️ 一、操作系统选型…...
使用 Windows 完成 iOS 应用上架:Appuploader对比其他证书与上传方案
iOS 应用上架流程对很多开发者来说都是一道复杂关卡,特别是当你并不使用 Mac 电脑时。虽然 Apple 一直强调使用其原生工具链(Xcode 和 Transporter),但现实是大量开发者正在寻找更灵活的替代方案。 今天我将从证书申请和 IPA 上传…...

IDEA中的debug使用技巧
详细教学视频见b站链接:IDEA的debug调试 CSDN详细博客文章链接:debug文章学习 以下为个人学习记录总结: idea中的debug模式界面如下: 现在详细介绍图标作用: 图标一(Show Execution Point)&…...

RockyLinux9.6搭建k8s集群
博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…...
MS358A 低功耗运算放大器 车规
MS358A 低功耗运算放大器 车规 产品简述 MS358A 是双通道运算放大器,具有低功耗、宽电源电压范围、高单位增益带宽的特性。在特定情况下,压摆率可以达到0.4V/μs 。每个通道的静态电流 (5V) 只有 430μA 。 MS358A输入共模范围可以到地,同时…...

AI IDE 正式上线!通义灵码开箱即用
近期,通义灵码AI IDE正式上线,即日起用户可在通义灵码官网免费下载开箱即用。 作为AI原生的开发环境工具,通义灵码AI IDE深度适配了最新的千问3大模型,并全面集成通义灵码插件能力,具备编程智能体、行间建议预测、行间…...
CRMEB 中 PHP 快递查询扩展实现:涵盖一号通、阿里云、腾讯云
目前已有一号通快递查询、阿里云快递查询扩展 扩展入口文件 文件目录 crmeb\services\express\Express.php 默认一号通快递查询 namespace crmeb\services\express;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use think\Container; use thi…...

Ubuntu20.04基础配置安装——系统安装(一)
引言: 工作需要,Ubuntu的各类环境配置,从23年开始使用Ubuntu20.04之后,尽管能力在不断提升,但是依旧会遇到Ubuntu系统崩掉的情况,为了方便后续系统出现问题及时替换,减少从网上搜索资源进行基础…...