Rust学习
一些区别
Rust:编译期重,保安全和高效;Go:编译期轻,保开发速度;C++:编译期灵活复杂,保极限性能。 怎么理解 意思是 Rust保证了安全 但是 Go C++等没有保证?
编译期
**Rust:**编译期严格检查,保证内存安全 + 线程安全
内存安全:编译器通过所有权(Ownership)、借用检查(Borrow Checker)在编译时杜绝空指针、悬垂指针、数据竞争等问题。
线程安全:类型系统确保并发访问的安全性(如 Send/Sync trait)。
fn main() {
let s = String::from("hello");
let r = &s;
drop(s); // 编译错误:s 被引用时不能移动
println!("{}", r);
}
Go: 编译期轻量,运行时安全(但非内存安全)
安全保证:
运行时安全检查:自动垃圾回收(GC)避免内存泄漏,但无法避免数据竞争。
简单性优先:语法简单,编译极快,适合快速开发。
代价:
无编译期内存安全机制(可能因并发访问导致数据竞争)。
GC 带来轻微运行时性能开销。
Go并不会阻止数据竞争 所以可能产生竞争的程序会正常运行,导致结果不确定,但是rust不可以运行
C++: 编译期灵活,性能极致,安全靠自觉
安全保证:
零成本抽象:手动管理内存/资源,性能最优。
可选的现代特性:智能指针(std::unique_ptr)、RAII 可提高安全性,但需开发者主动使用。
代价:
极易写出内存不安全代码(如悬垂指针、缓冲区溢出)。
编译期复杂(模板元编程、头文件依赖等)。
项目依赖管理
C++: 用 CMake 管理依赖和构建
Go: go.mod/go.sum 管理依赖 + 构建
Rust: Cargo 完全管理依赖 + 构建
c++的CMake管理
# 1. 声明从哪里获取 第三方库
FetchContent_Declare(
fmt
GIT_REPOSITORY https://github.com/fmtlib/fmt.git # 源码仓库
GIT_TAG 10.2.1 # 版本号
)
# 2. 下载并编译 fmt(如果是首次运行)
FetchContent_MakeAvailable(fmt)
# 3. 链接到你的项目
target_link_libraries(my_project PRIVATE fmt::fmt)
Rust的变量绑定
可变变量 (mut): 需手动同步(如用 Mutex)
不可变变量(默认):✅ 天然线程安全(只读)
let mut count = 0; // 可变
count += 1; // 合法
let count = 0; // 不可变
count += 1; // 编译错误!不能修改不可变变量
允许同时存在多个 不可变引用(只读)。
这些引用 不能 和 可变引用 同时存在。
同一作用域内,只能有一个可变引用(独占访问)。
可变引用不能和不可变引用同时存在。
let mut s = String::from("hello");
let r1 = &mut s;
let r2 = &mut s; // 编译错误!已有可变引用
println!("{}, {}", r1, r2);
如果允许两个 &mut 同时修改 s,可能导致数据竞争(Data Race) rust不允许这样
Rust的函数返回值
语句: 带有;不能作为返回值
表达式: 不带有; 可以作为返回值 x + 1
loop和while
无条件循环 和 有条件循环
##match && enum