当前位置: 首页 > news >正文

Rust 中 package crate 和 module 的关系

文章目录

  • 1.简介
  • 2.关系梳理与代码示例
    • 2.1 Rust 中的层级关系
    • 2.2 对应的Go代码组织
  • 3.核心区别
  • 4.总结
  • 参考文献

1.简介

在 Rust 中,这三者构成了代码组织的层次结构:

  • 一个包(Package)可以包含一个或多个 Crate;

一个包中至多 只能 包含一个库 crate(library crate);包中可以包含任意多个二进制 crate(binary crate);包中至少包含一个 crate,无论是库的还是二进制的。

  • 每个 Crate 则由若干 Module 组成。

为了更清晰地理解它们的对应关系,可以参考下面的表格:

概念 (Rust)Rust 含义对应Go的概念
包 (Package)由一个Cargo.toml文件构建的单元,可以包含一个或多个Crate。是最高层的代码组织单元无直接对应。Go的工作区(Workspace)功能与之略有相似,但定位不同。
Crate一个独立的编译单元,可以被编译成一个可执行文件或一个库。是版本控制和依赖管理的基本单元Go Module (go.mod)
模块 (Module)一个Crate内部的命名空间,用于控制代码的可见性和组织代码结构。Go Package (package)

2.关系梳理与代码示例

2.1 Rust 中的层级关系

包 (Package) → Crate → 模块 (Module)。

一个项目通常以一个“包”开始(即你运行cargo new创建的东西)。这个包声明了它所包含的 Crate。

# Cargo.toml - 定义了一个“包” [package] name = "my_project" version = "0.1.0" edition = "2021" # 一个包可以声明一个库Crate和一个二进制Crate... [lib] name = "my_lib" path = "src/lib.rs" [[bin]] name = "my_app" path = "src/main.rs"

在代码层面,Crate 的根文件是入口,你可以通过mod关键字在其内部定义模块。

// src/lib.rs (这是库Crate 'my_lib'的根)pubmodnetwork{// 定义一个名为 'network' 的模块pubfnconnect(){// 这是一个公开函数println!("Connecting...");}}modutils;// 声明另一个在 src/utils.rs 或 src/utils/mod.rs 中的模块

2.2 对应的Go代码组织

Go 语言的层级更扁平,通常一个目录就是一个package,而一个包含go.mod文件的目录则定义了一个 Go Module。

my-go-project/ // 项目根目录 (类似Rust的包概念,但不完全等同) ├── go.mod // ✅ 定义 Go Module (对应Rust的Crate) ├── main.go // ✅ 属于 main package (对应Rust的模块) ├── utils/ // 子目录 │ └── utils.go // ✅ 属于 utils package (对应Rust的模块)
// go.mod - 定义了一个 Go Modulemodule github.com/me/my-go-projectgo1.22
// utils/utils.go - 定义了utils包packageutils// Connect 函数是公开的 (首字母大写)funcConnect(){println("Connecting...")}

3.核心区别

1. 可见性控制不同

  • Rust:单元粒度是模块 (Module)。父模块可以访问子模块的私有项,但外部 Crate 只能访问标记为pub的项。Rust 没有“导出整个模块”的快捷方式,需要显式控制。

  • Go:单元粒度是包 (Package)。同一个包内的不同文件可以互相访问所有项,不需要额外声明。包内的私有项通过首字母小写来限定,公开项通过首字母大写来标识。

2. 文件与代码的对应关系

  • Rust:文件路径通常需要与模块树结构保持一致。模块声明(mod)是显式的,你可以选择内联模块代码或将代码放在单独的文件中。
  • Go:目录名与包名强相关。一个目录下的所有.go文件都属于同一个包,无需显式声明包含关系。

4.总结

  • Rust的“包” (Package)构建和项目管理单元,对应一个Cargo.toml文件。它在Go语言中没有直接等同的概念。
  • Rust 的 Crate编译和依赖的基本单元,对应Go中的Go Module (go.mod)
  • Rust的模块 (Module)代码组织和可见性控制单元,对应Go中的Go Package (package)

参考文献

Rust 程序设计语言

http://www.gsyq.cn/news/1338890.html

相关文章:

  • 编译器优化利器:Machine Outliner原理与应用实战
  • LuaJIT字节码逆向难题:LJD如何帮你恢复可读源码
  • 避开这些坑!SAP EWM盘点配置的5个常见误区与优化建议
  • 华为鸿蒙微信小窗/悬浮窗怎么弄?一看就会的操作教程
  • AI时代就业指南:Java程序员如何转行做大模型?AI大模型开发全攻略,高薪转型就靠它!
  • 用Python+Word批量生成幼儿骰子教具:从A4卡纸排版到图案自动填充的完整流程
  • 在Ubuntu 18.04上跑YOLOv5,除了权重下载,这些环境坑你也可能遇到(附排查清单)
  • 收藏 | 大模型岗位全解析:面试5类岗位后,我发现它们竟然是5种工作!小白程序员必看
  • 保姆级教程:用C#和MQTTnet库快速搭建一个物联网客户端(含断线重连实战)
  • 别再傻傻分不清了!GIS新手必看:WGS84和UTM到底怎么选?附QGIS/ArcGIS实操对比
  • 终极免费跨平台方案:draw.io桌面版完美编辑Visio文件
  • 如何在Windows系统上实现Steam Deck控制器的完整功能映射?
  • 8088单板机接口扩展实验(二)LCD1602
  • 从Spy++到Python脚本:手把手教你用pywin32.win32gui逆向分析桌面应用界面结构
  • eTs UI布局实战:从Flex容器到响应式设计,构建自适应界面
  • 【限时解禁】Midjourney官方未文档化的--sepia--与--chroma-shift--双引擎分离协议,实测提升色彩独立性达63.8%
  • GB35114客户端开发实战:手把手教你用eXosip2搞定SIP注册与SM2国密认证
  • Python核心基础
  • 发现FinalBurn Neo:解锁经典街机游戏的终极模拟方案
  • 零成本!用AI打造你的第一款游戏Demo(2026保姆级教程)
  • 终极无线协议分析指南:用URH快速成为无线安全专家
  • Arm SME指令集:SMOP4S与SMOPS矩阵运算优化指南
  • STM32F103工程跨型号移植实战:从‘小钢炮’C8T6到‘大坦克’ZET6,资源升级全记录
  • 对抗性深度强化学习:自动驾驶碰撞避免算法的极限压力测试框架
  • ElevenLabs支持海南话吗?2024最新实测结果曝光:仅3.2%开发者知道的方言微调密钥
  • LVGL多语言界面实战:一个工程如何优雅管理中英文两套字体(含动态切换代码)
  • Python websocket-client事件回调全解析:从连接到关闭,一个不漏的保姆级指南
  • 基于i.MX8M Mini核心板的工业压力位移智能分析仪方案详解
  • 用FPGA和串口玩点不一样的:手把手教你实现PC传图到TFT屏实时显示(Vivado 2023.1)
  • 这种只有ISSN号没有CN号的期刊是否靠谱,能投吗?