Rust

String vs &str — The Cheat Sheet

admin by @admin ADMIN
2d ago
May 31, 2026
Public
0 0 up · 0 down Sign in to vote
`String` is an owned, growable heap allocation; `&str` is a borrowed view into a UTF-8 buffer. Function params should usually take `&str`; return types use `String` when ownership is needed.
Rust
Raw
fn greet(name: &str) -> String {           // take &str, return String
    format!("Hello, {name}!")               // format! always returns String
}

fn main() {
    // String literals are &'static str
    let lit: &str = "hello";

    // Build a String (heap-allocated, mutable)
    let mut owned: String = String::from("hi");
    owned.push_str(", world");

    // &str ↔ String
    let from_string: &str = &owned;                       // String → &str
    let to_string:   String = "abc".to_string();          // &str   → String
    let also_to:     String = String::from("abc");        // same thing

    // Slice into a UTF-8 boundary — bytes, not chars!
    let s = "héllo";
    println!("{}", &s[0..3]);                             // "hé" (h + é which is 2 bytes)
    // &s[0..2] would panic — not a char boundary

    println!("{} {} {} {}", lit, owned, from_string, to_string);
    println!("{}", greet("Alice"));
}
Tags

Save your own code snippets

Create a free account and build your private vault. Share publicly whenever you want.