给 Golang 开发者的 Rust 私房菜 03 数据类型

视频

建议前往 B 站观看哦!

课程笔记

Rust 的数据类型概述

Rust 是一门静态类型语言,在编译时就会进行严格的类型检查。

Rust 的数据类型可以分为两大类:

  1. 标量类型(Scalar Types)
    • 单个值,如整数、浮点数、布尔值、字符。
  2. 复合类型(Compound Types)
    • 包含多个值的类型,如元组和数组。

与 Golang 对比:

  • Rust 的类型定义更加严格,默认不会隐式类型转换。
  • 更注重内存安全和性能优化。

标量类型

整数类型

  • 有符号整数(Signed): i8, i16, i32, i64, i128, isize
  • 无符号整数(Unsigned): u8, u16, u32, u64, u128, usize

isizeusize类型取决于运行程序的计算机的体系结构:如果使用 64 位体系结构,则为 64 位;如果使用 32 位体系结构,则为 32 位。

默认类型是 i32,因为它的性能较好。

示例
1
2
3
4
5
fn main() {
  let x: i32 = 10;
  let y: u8 = 255;
  println!("x: {}, y: {}", x, y);
}

溢出行为:

  • 调试模式:触发 panic。
  • 发布模式:会循环取值。

浮点类型

  • f32: 32 位浮点数
  • f64: 64 位浮点数(默认)
示例
1
2
3
4
fn main() {
  let pi: f64 = 3.14159;
  println!("Pi: {}", pi);
}

布尔类型

  • 类型为 bool
  • 值为 truefalse
示例
1
2
3
4
fn main() {
  let is_rust_fun = true;
  println!("Rust is fun: {}", is_rust_fun);
}

字符类型

  • 使用单引号定义。
  • 支持 Unicode,长度为 4 字节。
示例
1
2
3
4
fn main() {
    let emoji = '😊';
    println!("Emoji: {}", emoji);
}

复合类型

元组(Tuple)

  • 可包含多种不同类型的值。
  • 元组的长度是固定的。
示例
1
2
3
4
5
fn main() {
  let tup: (i32, f64, u8) = (500, 6.4, 1);
  let (x, y, z) = tup; // 解构元组
  println!("The value of y is: {}", y);
}

数组(Array)

  • 固定长度,元素类型必须相同
  • 与 Golang 的切片不同,Rust 的数组大小在编译期就确定。
示例
1
2
3
4
5
6
7
8
fn main() {
  // 类型推导
  let arr = [1, 2, 3];
  // 指定类型
  let arr: [i32; 3] = [1, 2, 3];

  println!("Array: {:?}", arr);
}

类型转换

Rust 不支持隐式类型转换,必须显式转换。

  • 使用 as 关键字进行类型转换。
示例
1
2
3
4
5
fn main() {
  let x = 10;
  let y = x as f64 / 3.0;
  println!("y: {}", y);
}

实践建议

  • 优先使用类型推导:Rust 的类型推导可以减少代码冗余。
  • 注意整数溢出:调试模式下会 panic,发布模式下会循环取值。
Licensed under CC BY-NC-SA 4.0