
文章目录1.简介2.关系梳理与代码示例2.1 Rust 中的层级关系2.2 对应的Go代码组织3.核心区别4.总结参考文献1.简介在 Rust 中这三者构成了代码组织的层次结构一个包Package可以包含一个或多个 Crate一个包中至多 只能 包含一个库 cratelibrary crate包中可以包含任意多个二进制 cratebinary 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 程序设计语言