[特殊字符] 深入解析:Go 与 Rust 中的数组与动态集合结构
在 Go 和 Rust 这两种现代语言中,数组和动态集合(如切片或 Vec)是处理数据的基础工具。虽然它们都提供了高效的内存访问能力,但设计理念却截然不同:
- Go 更注重灵活性和性能,允许开发者直接操作底层指针和容量。
- Rust 则强调安全性和零成本抽象,通过编译器保障内存安全,避免越界等常见错误。
本文将从数组、切片(Go)与 Vec(Rust)、切片引用(&[T]
)出发,深入分析其底层机制与行为差异,并提供完整的可运行代码示例。
📦 一、Go 中的数组与切片
1. Go 数组
Go 的数组是固定长度的数据结构,存储在栈上(除非显式分配到堆),一旦声明长度不可变。
package mainimport "fmt"func main() {arr := [5]int{1, 2, 3, 4, 5}fmt.Println("Array:", arr)fmt.Printf("Length: %d, Size in bytes: %d\n", len(arr), cap(arr))
}
输出:
Array: [1 2 3 4 5]
Length: 5, Size in bytes: 5
⚠️
cap(arr)
在 Go 中对数组无效,这里只是说明数组的大小固定。
2. Go 切片(Slice)
Go 的切片是对数组的一层封装,包含三个字段:指向底层数组的指针、当前长度(len)、最大容量(cap)。
package mainimport "fmt"func main() {// 创建一个底层数组为 [0, 0, 0, 0, 0] 的切片s := make([]int, 2, 5)fmt.Printf("Slice s: len=%d cap=%d %v\n", len(s), cap(s), s)// 修改切片视图s = s[:4]fmt.Printf("After s = s[:4]: len=%d cap=%d %v\n", len(s), cap(s), s)// 再次修改s = s[2:]fmt.Printf("After s = s[2:]: len=%d cap=%d %v\n", len(s), cap(s), s)
}
输出:
Slice s: len=2 cap=5 [0 0]
After s = s[:4]: len=4 cap=5 [0 0 0 0]
After s = s[2:]: len=2 cap=3 [0 0]
可以看到,每次切片操作都会影响 len
和 ptr
,进而改变 cap
。
📦 二、Rust 中的数组与 Vec
1. Rust 数组
Rust 的数组也是固定长度的,但更强调类型安全和边界检查。
fn main() {let arr: [i32; 5] = [1, 2, 3, 4, 5];println!("Array: {:?}", arr);println!("Length: {}", arr.len());
}
输出:
Array: [1, 2, 3, 4, 5]
Length: 5
❗ Rust 不允许你访问超过
.len()
的索引,否则会 panic。
2. Rust 向量(Vec)
Vec<T>
是 Rust 的动态数组实现,支持自动扩容和切片操作。
fn main() {let mut v = Vec::with_capacity(5);for i in 0..3 {v.push(i);}println!("Vec: {:?}", v);println!("Len: {}, Capacity: {}", v.len(), v.capacity());// 切片操作let slice = &v[..2];println!("Slice: {:?}", slice);
}
输出:
Vec: [0, 1, 2]
Len: 3, Capacity: 5
Slice: [0, 1]
注意:slice
是一个只读视图,不能直接 push 数据,只能通过原始 Vec
修改内容。
3. Rust 切片引用(&[T])
Rust 的切片引用类似于 Go 的切片,但它不包含 capacity 字段,只能看到当前可见的范围。
fn main() {let v = vec![0, 0, 0, 0, 0];let c = &v[..2]; // len=2println!("c: {:?}", c);// 错误:越界访问let d = &c[2..5]; // panic!println!("d: {:?}", d);
}
这个例子会在运行时报错:
thread 'main' panicked at 'index 2..5 outside bounds of [..2]'
🔁 三、Go 与 Rust 的核心区别总结
特性 | Go | Rust |
---|---|---|
数组是否固定长度 | ✅ 是 | ✅ 是 |
是否支持动态数组 | ✅ 切片 + 底层数组 | ✅ Vec |
切片是否包含 capacity | ✅ 是 | ❌ 否(只有 Vec 有) |
切片是否能访问超出当前 len 的数据 | ✅ 只要不超过 cap | ❌ 不行,panic |
是否允许手动管理 ptr/len/cap | ✅ 支持(unsafe) | ❌ 不支持(除非 unsafe) |
内存安全性 | ❌ 需要开发者控制 | ✅ 编译器/运行时保障 |
🧩 四、设计哲学对比
Go | Rust |
---|---|
灵活、高效、适合系统级编程 | 安全、可靠、适合高性能 + 安全并重场景 |
切片操作灵活但容易出错 | 切片安全但表达力略逊 |
更适合熟悉底层机制的开发者 | 更适合希望专注于逻辑而非细节的开发者 |
🎁 五、延伸实践建议
✅ 1. 手动模拟 Go 的切片结构体(Rust unsafe)
你可以用 Rust 的 unsafe
来模拟 Go 的切片结构体:
use std::slice;#[repr(C)]
struct MySlice<'a, T> {data: *const T,len: usize,cap: usize,_marker: std::marker::PhantomData<&'a T>,
}impl<'a, T> MySlice<'a, T> {fn from_vec(v: &'a Vec<T>) -> Self {MySlice {data: v.as_ptr(),len: v.len(),cap: v.capacity(),_marker: std::marker::PhantomData,}}unsafe fn as_slice(&self) -> &'a [T] {slice::from_raw_parts(self.data, self.len)}unsafe fn slice(&self, start: usize, end: usize) -> &'a [T] {if end > self.cap {panic!("Out of capacity");}slice::from_raw_parts(self.data.offset(start as isize), end - start)}
}fn main() {let v = vec![1, 2, 3, 4, 5];let my_slice = MySlice::from_vec(&v);unsafe {let s = my_slice.slice(2, 5);println!("Simulated slice: {:?}", s);}
}
这个例子展示了如何在 Rust 中模拟 Go 的切片行为,同时保留 capacity 控制。
📝 六、结语
Go 和 Rust 在数组与集合类型的设计上体现了不同的语言哲学:
- Go 的切片 提供了极致的灵活性和性能,但也要求开发者对底层数组的生命周期和容量变化非常敏感。
- Rust 的 Vec 和 &[T] 则以安全为核心,牺牲了一定的灵活性,但极大地降低了出错的可能性。
掌握这两者的区别,有助于你在不同项目中选择合适的语言和数据结构。
📚 延伸阅读推荐
- Go 切片官方文档
- Rust Vec 文档
- Rust Slice 文档
- 《Programming Rust》第 4 章:Vectors and Slices
- 《The Go Programming Language》第 4 章:Composite Types
相关文章:
[特殊字符] 深入解析:Go 与 Rust 中的数组与动态集合结构
在 Go 和 Rust 这两种现代语言中,数组和动态集合(如切片或 Vec)是处理数据的基础工具。虽然它们都提供了高效的内存访问能力,但设计理念却截然不同: Go 更注重灵活性和性能,允许开发者直接操作底层指针和容…...
C25-数组应用及练习
第一题 题目: 代码 #include <stdio.h> int main() {//数组及相关数据定义int arr[10];int i;//基于循环的数组数据输入for(i0;i<10;i){arr[i]i;}//基于循环的数组数据输出for(i9;i>0;i--){printf("%d ",arr[i]);}return 0; }结果 第二题 题目 代码 …...
Soft Mask(软遮罩)技术
一、概述 Soft Mask是一种技术或工具,主要用于实现平滑的边缘遮罩效果。它在不同的应用领域有不同的实现和定义 1.在Unity UI设计中 SoftMask是一款专为Unity设计的高级遮罩工具,它突破了传统Mask的限制,提供了更为灵活和细腻的UI遮罩解决方案…...
683SJBH基于J2EE的广州旅游管理系统
第1章 绪论 课题背景 自互联网internet成为一种革命性的大众媒体以来,其发展速度之快令人惊叹。而作为世界最大朝阳产业的旅游,当它与电子商务这一新兴模式相结合时,其潜藏的商业价值表露无遗。根据CNN(美国有线电视新闻网&…...
关于STM32 SPI收发数据异常
问题描述: STM32主板做SPI从机,另一块linux主板做主机,通信的时候发现从机可以正确接收到主机数据,但是主机接收从机数据时一直不对,是随机值。 问题原因: 刚发现问题的时候,用逻辑分析仪抓包…...
雅努斯问题(Janus Problem)及解决方案
一、雅努斯简介 雅努斯(Janus)是罗马神话中的门神,也是罗马人的保护神。他具有前后两个面孔或四方四个面孔,象征开始。雅努斯被认为是起源神,执掌着开始和入门,也执掌着出口和结束,因此他又被成…...
ACE-Step:扩散自编码文生音乐基座模型快速了解
ACE-Step 模型速读 一、模型概述 ACE-Step 是一款由 ACE Studio 和 StepFun 开发的新型开源音乐生成基础模型。它通过整合基于扩散的生成方式、Sana 的深度压缩自编码器(DCAE)以及轻量级线性变换器,在音乐生成速度、音乐连贯性和可控性等方…...
【论文阅读】在调制分类中针对对抗性攻击的混合训练时和运行时防御
A Hybrid Training-Time and Run-Time Defense Against Adversarial Attacks in Modulation Classification 摘要 在深度学习在包括计算机视觉和自然语言处理在内的许多应用中的卓越性能的推动下,最近的几项研究侧重于应用深度神经网络来设计未来几代无线网络。然而,最近的…...
HDMI布局布线
1 HDMI简介 高清多媒体接口(High Definition Multimedia Interface),简称:HDMI,是一种全数字化视频和声音发送接口,可以发送未压缩的音频及视频信号。随着技术的不断提升,HDMI的传输速率也不断的提升,HDMI2.0最大传输速率可达14.4Gbit/s,HDMI2.1最大传输数据速率可达42.6Gbit/s…...
国家信息中心:基于区块链和区块链服务网络(BSN)的可信数据空间建设指引
推荐语: 可信数据空间包含场景应用、生态主体、数据资源、规则机制、技术系统五大部分。《基于区块链和区块链服务网络(BSN)的可信数据空间建设指引》聚焦可信数据空间的单个数据空间中的场景应用、数据资源、规则机制及技术系统四大核心要点…...
分区器(1)
1. 需求分析 在分布式计算中,Map任务通常会产生大量的中间结果,这些结果需要被分配到不同的Reducer任务中进行进一步处理。分区器的作用是根据一定的规则将中间结果分配到不同的分区(Partition),从而确保数据能够被正…...
设计一个分布式系统:要求全局消息顺序,如何使用Kafka实现?
一、高吞吐低延迟 Kafka 集群设计要点 1. 分区策略优化 // 计算合理分区数公式(动态调整) int numPartitions max(Tp, Tc) / min(Tp, Tc) // Tp生产者吞吐量 Tc消费者吞吐量建议初始按业务键(如订单ID)哈希分区单分区吞吐建议…...
大模型工具与案例:云服务器部署dify(1)
如果您可以装wsl,可以在本机部署参考windows安装dify-江鸟阁长 因为笔者的windows电脑不可以安装wsl,所以本文会带大家在linux云服务器上部署。目前很多厂家都推出了一键部署,但是价格也有差 阿里云 通用型服务器 70rmb/月 华为云比较便宜&a…...
屏蔽力 | 在复杂世界中从内耗到成长的转变之道
注:本文为“屏蔽力”相关文章合辑。 略作重排,未全整理。 世上的事再复杂,不外乎这三种 原创 小鹿 读者 2022 年 12 月 02 日 18 : 27 甘肃 文 / 小鹿 在这世上,每天都有大事小事、琐事烦事。我们总为世事奔波忙碌,…...
信息系统项目管理师-软考高级(软考高项)2025最新(十一)
个人笔记整理---仅供参考 第十一章项目成本管理 11.1管理基础 11.2项目成本管理过程 11.3规划成本管理 11.4估算成本 11.5制定预算 11.6控制成本...
大数据技术全景解析:Spark、Hadoop、Hive与SQL的协作与实战
引言:当数据成为新时代的“石油” 在数字经济时代,数据量以每年50%的速度爆发式增长。如何高效存储、处理和分析PB级数据,成为企业竞争力的核心命题。本文将通过通俗类比场景化拆解,带你深入理解四大关键技术:Hadoop、…...
Linux 驱动开发步骤及 SPI 设备驱动移植示例
Linux 驱动开发的一般步骤 硬件了解:深入研究目标硬件设备的工作原理、寄存器映射、电气特性、中断机制等。例如,若开发网卡驱动,需清楚网卡如何与网络介质交互、数据包的收发流程、硬件缓冲区的管理等。只有透彻理解硬件,才能编…...
直播数据大屏是什么?企业应如何构建直播数据大屏?
目录 一、直播数据大屏是什么? 1. 定义 2. 特点 编辑二、企业如何构建直播数据大屏? (一)明确需求和目标 (二)数据采集和整合 (三)选择合适的可视化工具 (四&a…...
Vue与Python的深度整合:构建现代Web应用的全栈范式
在前后端分离架构成为行业标准的今天,Vue.js与Python的组合为全栈开发提供了高效且灵活的技术方案。这种组合不仅继承了Vue组件化开发的敏捷性,更借助Python后端框架(如Django/Flask)的强大生态,实现了从原型设计到生产…...
移动二维矩阵
1、题目描述 小红获得了一个 n行 m 列的二维字符矩阵,现在她要对这个字符矩阵进行向左循环移位。 向左循环移位规则如下:每一行的每一个字母(除了第一个字母)都向左边移动一位。第一行第一个的字母移动到最后一行的最后一个位置,其它行的第一…...
RabbitMq学习(第一天)
文章目录 1、mq(消息队列)概述2、RabbitMQ环境搭建3、java基于AMQP协议操作RabbitMQ4、基于Spring AMQP操作RabbitMQ5、代码中创建队列与交换机①、配置类创建②、基于RabbitListener注解创建 6、RabbitMQ详解①、work模型②、交换机1、Fanout(广播)交换机2、Direct(定向)交换机…...
基于RK3568多功能车载定位导航智能信息终端
基于安卓系统开发集成5G和4G模块,GPS/BD双模定位模块(高精度差分惯导)、WIFI模块,蓝 牙模块,RFID模块,音频播放,视频信号输入(AHD或CVBS)模块等多功能车载定位导航智能信…...
Facebook的元宇宙新次元:社交互动如何改变?
科技的浪潮正将我们推向一个全新的时代——元宇宙时代。Facebook,这个全球最大的社交网络平台,已经宣布将公司名称更改为 Meta,全面拥抱元宇宙概念。那么,元宇宙究竟是什么?它将如何改变我们的社交互动方式呢ÿ…...
【上位机——MFC】对话框
对话框的使用 1.添加对话框资源 2.定义一个自己的对话框类(CMyDlg),管理对话框资源,派生自CDialog或CDialogEx均可 对话框架构 #include <afxwin.h> #include "resource.h"class CMyDlg :public CDialog {DECLARE_MESSAGE_MAP() publi…...
【信息系统项目管理师】法律法规与标准规范——历年考题(2024年-2020年)
手机端浏览☞【信息系统项目管理师】法律法规与标准规范——历年考题(2024年-2020年) 2024年上半年综合知识【占比分值3′】 42、关于招标投标的描述,不正确的是(属于同一集团组织成员的投标人可以按照该组织要求协同投标…...
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例
【HarmonyOS 5】鸿蒙Web组件和内嵌网页双向通信DEMO示例 一、前言 在 ArkUI 开发中,Web 组件(Web)允许开发者在应用内嵌入网页,实现混合开发场景。 本文将通过完整 DEMO,详解如何通过WebviewController实现 ArkUI 与内嵌网页的双向通信,涵盖 ArkUI 调用网页 JS、网页调…...
var、let、const的区别
1. var 在ES5中,顶层对象的属性和全局变量是等价的,用var声明的变量即是全局变量,也是顶层变量,在浏览器中顶层对象指的是window对象,在node中顶层对象指的是global对象。 console.log(a) // undefined var a 1 cons…...
计算机视觉注意力机制【一】常用注意力机制整理
在做目标检测项目,尤其是基于 YOLOv5 或 YOLOv7 的改进实验时,我发现不同注意力机制对模型性能的提升确实有明显影响,比如提高小目标检测能力、增强特征表达等。但每次找代码都得翻论文、找 GitHub,效率很低。所以我干脆把常见的注…...
交替序列长度的最大值
1、题目描述 给出n个正整数,你可以随意从中挑选一些数字组成 一段序列S,该序列满足以下两个条件: 1.奇偶交替排列:例如:"奇,偶,奇,偶,奇.…" 或者 "偶&a…...
追踪大型语言模型的思想(下)(来自针对Claude的分析)
多步推理 正如我们上面所讨论的,语言模型回答复杂问题的一种方式就是简单地记住答案。例如,如果问“达拉斯所在州的首府是哪里?”,一个“机械”的模型可以直接学会输出“奥斯汀”,而无需知道德克萨斯州,达拉…...
嵌入式通信协议总览篇:万物互联的基石
嵌入式系统的世界,是靠协议“说话”的世界。 在你设计一个智能设备、构建一个工业控制系统、开发一款 IoT 网关时,一个核心问题始终绕不开:**这些设备之间如何“对话”?**答案就是——通信协议。 本篇作为系列第一章,将带你全面理解嵌入式通信协议的全貌,为后续深入学习…...
Android 连接德佟打印机全实例+踩坑
文章目录 1. sdk下载2. 开始开发2.1 打印之前准备工作2.2 打印机是否连接检测2.3 打印框架设计 最近有个需求是要连接 德佟打印机 进行打印相关事宜, 现在就遇到的问题简单阐述一下。 1. sdk下载 我们首先需要在官网下载对应的SDK,地址为:https://www.d…...
TikTok 矩阵运营新手实操保姆级教程 2.0 版本
在当下这个全球化的数字浪潮中,TikTok 这片充满机遇的流量蓝海,正吸引着无数创业者和品牌方争相角逐。而要想在这激烈的竞争中脱颖而出,TikTok 矩阵运营无疑是至关重要的制胜法宝。今天,就给大家送上这份超实用的新手实操教程&…...
WordPress:Locoy.php火车头采集
<?php /* 模块参数列表: post_title 必选 标题 post_content 必选 内容 tag 可选 标签 post_category 可选 分类 post_date 可选 时间 post_excerpt 可选 摘要 post_author 可选 作者 category_description 可选 分类信息 post_cate_meta[name] 可选 自定义分…...
C++ 有哪些标准版本
目录 1.主要分为以下几个版本C98(ISO/IEC 14882:1998) 第一个国际标准C03(ISO/IEC 14882:2003)小幅度修订C11(ISO/IEC 14882:2011)一次重大更新C14(ISO/IEC 14882:2014)增量改进C17&…...
二、MySQL操作命令汇总
文章目录 二、MySQL操作命令汇总1.数据库操作2.表的增删改查2.1 查表2.2 建表给表添加注释假如表已经存在 2.3 删表2.4 查看表结构2.5 改表 3.简单查询3.1 查询单个字段3.2 查询多个字段3.3 查询所有字段3.4 查询结果去重3.5 查询结果排序3.6 查询结果限制条数3.7 查询分组结果…...
编程日志4.28
队列的链表表示代码 #include<iostream> #include<stdexcept> using namespace std; //队列 类的声明 template<typename T>//1.模板声明,表明Queue类是一个通用的模板类,可以用于存储任何类型的元素T class Queue {//2.Queue类的声…...
Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType)
Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType) Qt 中信号与槽(signal-slot)机制支持 多种连接方式(ConnectionType),用于控制信号发出后如何调用槽…...
Python案例实战《手势识别》
目录 1、效果图2、手势识别关键步骤(1) 导入必要的库(2)配置 MediaPipe(3)启动摄像头(4)设置手指张开判断的距离阈值(5)计算手指之间的欧几里得距离ÿ…...
NGINX `ngx_http_charset_module` 字符集声明与编码转换
一、模块定位与功能 ngx_http_charset_module 主要提供两大能力: 响应头声明:在 Content-Type 头部自动添加 ; charsetXXX,告知客户端所用字符集。单向编码转换:在 NGINX 层将一种单字节编码(如 koi8-r、windows-125…...
进程与线程详细介绍
目录 一 进程概念 二 进程的组成 2.1 PCB 2.2 数据段 2.3 程序段 三 进程的五大特点 四 进程的创建与销毁 五 线程概念 六 线程特征 七 进程与线程的区别与联系 区别 联系 一 进程概念 进程是程序的一次执行过程,是操作系统进行资源分配和调度的基本单位…...
JAVA中ArrayList的解析
gogogo出发喽!让我们来认识一下它吧 什么是ArrayList Java 中的 ArrayList 是 Java 集合框架中的重要类,用于实现动态数组 动态数组:可按需自动扩展或缩小,无需手动管理数组大小。比如不断向 ArrayList 添加元素时,…...
【LLM+Code】Devin PromptTools详细解读
Devin 官网:https://devin.ai/ Prompt 大部分篇幅都是tools的直出的description和parameters的一些信息 其他的包含 Communicatework的一些指导Best PracticesInformation HandlingData SecurityResponse Limitationsplanthink You are Devin, a software engi…...
AI应用开发实战分享
一、前言 30年前的IntelWindows互相绑定,让世界被计算机技术重构了一次,有了程序员这个工种。十几年前iPhone、Android前后脚发布,智能手机和移动App互相绑定,引爆了一个长达十几年的移动互联网大跃进时代。而随着人工智能大模型…...
浅聊find_package命令的搜索模式(Search Modes)
背景 find_package应该算是我们使用最多的cmake命令了。但是它是如何找到上游库的.cmake文件的? 根据官方文档,整理下find_package涉及到的搜索模式。 搜索模式 find_package涉及到的搜索模式有两种:模块模式(Module mode)和配置模式(Conf…...
FPGA图像处理(二)-----彩色图像灰度化
由于fpga实现除法相对复杂,故将除法变为乘法再移位。因此每种方法对图像输入数据均分3步进行,极其有效信号打三拍处理。 timescale 1ns / 1ps // // Description: 彩色图像灰度化 // module image_rgb2gray(input wire clk ,input wir…...
Ultralytics中的YOLODataset和BaseDataset
YOLODataset 和 BaseDataset 是 Ultralytics YOLO 框架中用于加载和处理数据集的两个关键类。 YOLODataset类(ultralytics/data/dataset.py)继承于 BaseDataset类(ultralytics/data/base.py) BaseDataset() BaseDataset 是一个…...
Mac 使用 Charles代理生成https服务
在Mac电脑上使用Charles软件通过代理生成HTTPS服务,让手机访问电脑的开发地址,可按以下步骤操作: 一、Charles软件设置 安装与启动Charles:从Charles官网下载并安装Charles软件,之后启动它。开启代理服务 点击菜单栏…...
【PostgreSQL】数据库主从库备份与高可用部署
文章目录 一、架构设计原理二、部署清单示例2.1 StatefulSet配置片段2.2 Service配置三、配置详解3.1 主节点postgresql.conf3.2 从节点配置四、初始化流程4.1 创建复制用户4.2 配置pg_hba.conf五、故障转移示例5.1 自动切换脚本5.2 手动提升从节点六、监控与维护6.1 关键监控指…...
ERP进销存系统源码,SaaS模式多租户ERP管理系统,SpringBoot、Vue、UniAPP技术框架
SaaS ERP管理系统源码,覆盖了整个生产企业所有部门的管理:采购、销售、仓库、生产、财务、质量、OA: ERP源码技术架构:SpringBootVueElementUIUniAPP ERP系统功能清单: 流程处理中心:待审批任务、已审批任…...