Instead of transferring ownership, Rust lets you borrow values with references (&T for immutable, &mut T for mutable). Borrows allow functions to read or modify data without taking ownership, so the caller retains access afterward. The borrow checker enforces that you can have either many immutable borrows or one mutable borrow at a time, preventing data races. This is enforced at compile time with zero runtime cost. I use immutable borrows for read-only operations and mutable borrows when I need to modify in place. The lifetime annotations ensure references never outlive the data they point to. This pattern is pervasive in Rust APIs and enables safe concurrency without locks in many cases.