Rust 中 package crate 和 module 的关系

文章目录

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。

toml 复制代码
# 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关键字在其内部定义模块。

rust 复制代码
// src/lib.rs (这是库Crate 'my_lib'的根)
pub mod network {  // 定义一个名为 'network' 的模块
    pub fn connect() {  // 这是一个公开函数
        println!("Connecting...");
    }
}

mod utils; // 声明另一个在 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 复制代码
// go.mod - 定义了一个 Go Module
module github.com/me/my-go-project

go 1.22
go 复制代码
// utils/utils.go - 定义了utils包
package utils

// Connect 函数是公开的 (首字母大写)
func Connect() {
    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 程序设计语言

相关推荐
花褪残红青杏小19 小时前
Rust图像处理第11节-故障风 RGB 通道偏移:错位错色制造电子故障
rust·webassembly·图形学
花褪残红青杏小20 小时前
Rust图像处理第10节-浮雕/雕刻滤镜:邻域差值生成凹凸效果
rust·webassembly·图形学
Rockbean20 小时前
10分钟Solana-性能web3-2.4 Rust 编程基础三:结构体、枚举、错误处理与集合
rust·web3·智能合约
doiito1 天前
【Agent Harness】Gliding Horse 上下文感知与智能压缩:让 Agent 的“注意力”永不偏移
ai·rust·架构设计·系统设计·ai agent
花褪残红青杏小2 天前
Rust图像处理第9节-Sobel 边缘检测:第一个真正用卷积的算法
rust·webassembly·图形学
doiito2 天前
【Agent Harness】Gliding Horse L2 作战地图深度优化:给多 Agent 上下文装上“精准导航”
ai·rust·架构设计·系统设计·ai agent
花褪残红青杏小2 天前
Rust图像处理第8节-暗角 & 复古胶片特效:四周衰减中心高亮
rust·webassembly·图形学
独孤留白3 天前
从C到Rust:Rust 的 Trait 不是Interface,那是什么?
rust