1. ```rust fn main() { let arr = [1, 2, 3]; let s1: &[i32] = &arr[0..2]; let s2: &str = "hello, world"; } ``` 2. ```rust fn main() { let arr: [char; 3] = ['中', '国', '人']; let slice = &arr[..2]; // TIPS: slice( reference ) IS NOT an array, if it is an array, then `assert!` will passed: each of the two UTF-8 chars '中' and '国' occupies 3 bytes, 2 * 3 = 6 assert!(std::mem::size_of_val(&slice) == 16); } ``` 3. ```rust fn main() { let arr: [i32; 5] = [1, 2, 3, 4, 5]; let slice: &[i32] = &arr[1..4]; assert_eq!(slice, &[2, 3, 4]); } ``` 4. ```rust fn main() { let s = String::from("hello"); let slice1 = &s[0..2]; let slice2 = &s[..2]; assert_eq!(slice1, slice2); } ``` 5. ```rust fn main() { let s = "你好,世界"; let slice = &s[0..3]; assert!(slice == "你"); } ``` 6. ```rust fn main() { let mut s = String::from("hello world"); // here, &s is `&String` type, but `first_word` need a `&str` type. // it works because `&String` can be implicitly converted to `&str, If you want know more ,this is called `Deref` let word = first_word(&s); println!("the first word is: {}", word); s.clear(); } fn first_word(s: &str) -> &str { &s[..1] } ```