提示:本网站现在为维护调试状态

Rust 所有權與借用機制:徹底理解生命週期

Choyeon
Choyeon
2026年9月7日 1 分鐘閱讀 401 閱讀
594 字 1,599 字元 更新於 2026年11月8日
Rust 所有權與借用機制:徹底理解生命週期
目錄

Rust 所有权与借用机制:彻底理解生命周期

Rust 不用 GC 却能保证内存安全,核心武器是所有权系统和借用检查器。编译期检查内存访问合法性,运行时零开销,但理解门槛是主流语言中最高的。

三大所有权铁律

1)每个值有且仅有一个所有者;2)所有者离开作用域,值立即被 drop;3)同一值最多只能有一个可变引用,可变和不可变引用不能同时存在。几乎所有初学生命周期错误都是违背第3条。

use std::collections::HashMap;

#[derive(Debug, Clone)]
struct User { id: u32, username: String, profile: Option<Box<User>> }

struct UserCache<'a> {
    users: HashMap<u32, User>,
    last_accessed: Option<&'a User>,
}

impl<'a> UserCache<'a> {
    fn new() -> Self { Self { users: HashMap::new(), last_accessed: None } }
    fn insert(&mut self, user: User) { self.users.insert(user.id, user); }
    fn get(&'a mut self, id: u32) -> Option<&'a User> {
        if let Some(u) = self.users.get(&id) {
            self.last_accessed = Some(u);
            self.last_accessed
        } else { None }
    }
}

fn longest_str<'a>(x: &'a str, y: &'a str) -> &'a str { if x.len() >= y.len() { x } else { y } }

struct Parser<'s, 'b> where 's: 'b { source: &'s str, buffer: &'b mut [u8] }

impl<'s, 'b> Parser<'s, 'b> where 's: 'b {
    fn new(source: &'s str, buffer: &'b mut [u8]) -> Self { Self { source, buffer } }
}

fn main() {
    let s1 = String::from("hello");
    let s2 = s1.clone();
    println!("s1={s1}, s2={s2}");
    let a = String::from("short"); let b = String::from("longest string wins");
    println!("longest: {}", longest_str(&a, &b));
    let mut cache = UserCache::new();
    cache.insert(User { id: 1, username: "rosetta".into(), profile: None });
    let u = cache.get(1);
    println!("Got user: {:?}", u.map(|x| &x.username));
    let mut buf = vec![0u8; 1024];
    let p = Parser::new("input", buf.as_mut_slice());
    println!("Parser source len: {}", p.source.len());
}

生命周期标注与约束

当函数/结构体中出现引用时,Rust 需要显式生命周期标注('a、'b)告知编译器引用有效期关系。's: 'b 表示 's 存活时间不短于 'b,常见于结构体自引用场景。

常见错误 本质 修复模式
use of moved value 所有权被转移 .clone()/用&borrow
cannot borrow X mutable+immutable 违反借用规则 缩小作用域/分块
missing lifetime specifier 编译器推不出 加'a关联输入输出
lifetime may not live long enough 引用先被释放 延长作用域/改用拥有所有权类型

最佳实践

写代码初期全用拥有所有权类型(String/Vec/Box),编译通过后再按需改为引用。不要过早纠结生命周期标注,让编译器给你驱动式修改建议。

X微博Telegram

本文作者

投票

你最希望 Rosetta 优先加入哪项功能?

社区投票(演示数据,可后台删除)

留言 (4)

0 / 3000
运维老司机
运维老司机ops-notes.cn2026年9月14日

写得太好了,终于搞懂了分布式事务的几种方案区别,收藏了!

云端漫步
云端漫步cloud-notes.cloud2026年9月13日

补充一点:实际使用中如果遇到 MySQL 的 8 小时超时问题,可以在连接串里加 autoReconnect=true 参数,虽然官方不推荐但挺好用的。

考研加油鸭
考研加油鸭kaoyan-journey.xyz2026年9月12日

作为一个刚入行的后端新人,这篇文章帮我理清了好多概念,谢谢博主持续输出高质量内容!

画画的小鱼
画画的小鱼fishgallery.art2026年9月12日

好文!但是我觉得第三部分那个消息队列选型对比表有点偏向 Kafka 了,RocketMQ 在事务消息这块其实优势挺明显的。

相關文章

PostgreSQL 查詢優化技巧

PostgreSQL 查詢優化技巧

深入掌握 PostgreSQL 查詢優化的核心方法:從 EXPLAIN ANALYZE 執行計劃解讀,到索引類型選擇(B-tree/GIN/BRIN)、統計資訊更新、連接策略調整、分區表設計,全方位提升數據庫查詢性能。

1 分鐘閱讀
Linux 性能調優:perf_events + bpftrace + BCC

Linux 性能調優:perf_events + bpftrace + BCC

從 CPU、內存、IO、網絡四個維度,使用 perf_events 採樣堆棧、bpftrace 一行腳本追蹤內核點、BCC 工具集 biolatency/offcputime,快速定位生產服務器性能瓶頸,附真實排查思路。

1 分鐘閱讀
WebAssembly 入門:Rust 編譯 WASM + JS 調用

WebAssembly 入門:Rust 編譯 WASM + JS 調用

從零搭建 Rust → WebAssembly 開發流程:wasm-pack 工具鏈、wasm-bindgen 類型綁定、JavaScript 同步/異步調用 WASM 函數、內存共享與 TypedArray 傳遞大數據。

1 分鐘閱讀
Zero Trust 安全架構入門:永不信任,始終驗證

Zero Trust 安全架構入門:永不信任,始終驗證

零信任安全模型系統入門:以"永不信任,始終驗證"為核心原則,打破傳統邊界防護(VPN=內部可信)的思維。從身份認證(MFA/SAML)、設備健康檢查、最小權限 RBAC、微隔離 mTLS、持續信任評分到可觀測審計鏈路的 6 大支柱詳解,附落地實施路線。

1 分鐘閱讀
Kubernetes Pod 生命週期 + Init Container + Sidecar

Kubernetes Pod 生命週期 + Init Container + Sidecar

詳細拆解 Kubernetes Pod 從 Pending 到 Terminated 的完整狀態機、PostStart/PreStop 鉤子執行時機、Init Container 前置依賴保證、Sidecar 容器模式(istio-proxy、日誌收集),以及優雅終止零停機配置。

1 分鐘閱讀
測試金字塔:單元/整合/E2E 測試比例與落地

測試金字塔:單元/整合/E2E 測試比例與落地

系統解析測試金字塔架構:從底層單元測試(大量快速、Mock 隔離依賴)、中層整合測試(服務/數據庫/消息協作真實交互)、頂層 E2E 測試(真實用戶路徑少量精測)的推薦比例 70% / 20% / 10%,附項目覆蓋率指標與落地實踐。

1 分鐘閱讀