rust-错误处理
30.错误处理Rust 语言也有错误这个概念,而且把错误分为两大类:可恢复 和 不可恢复,相当于其它语言的 异常 和 错误。
Name
描述
Recoverable
可以被捕捉,相当于其它语言的异常 Exception
UnRecoverable
不可捕捉,会导致程序崩溃退出
panic!() 不可恢复错误panic!() 程序立即退出,退出时调用者抛出退出原因。
一般情况下,当遇到不可恢复错误时,程序会自动调用 panic!()。
12345678910fn main() { panic!("出错啦"); println!("Hello Rust"); // 不可能执行的语句}//输出thread 'main' panicked at '出错啦', src/main.rs:2:5let v = vec!["Go语言极简一本通","Go语言微服务架构核心22讲","从0到Go语言微服务架构师"]; ...
rust-线程
29.多线程
现代的操作系统,是一个多任务操作系统,系统可以管理多个程序的运行,一个程序往往有一个或多个进程,而一个进程则有一个或多个线程。
让一个进程可以运行多个线程的机制叫做多线程。
一个进程一定有一个主线程,主线程之外创建出来的线程叫 子线程
多线程(并发)编程的一个重要思想就是 程序不同的部分可以同时独立运行互不干扰。
创建线程1234std::thread::spawn()//spawn() 函数的原型pub fn spawn<F, T>(f: F) -> JoinHandle<T>
参数 f 是一个闭包(closure ) 是线程要执行的代码。
123456789101112131415fn main() { //子线程 thread::spawn(|| { for i in 1..10 { println!("子线程 {}", i); thread::sleep(Duration::from_m ...
rust-闭包
28.闭包Rust 中的闭包(closure),也叫做 lambda 表达式或者 lambda,是一类能够捕获周围作用域中变量的函数。
调用一个闭包和调用一个函数完全相同,不过调用闭包时,输入和返回类型两者都可以自动推导,而输入变量名必须指明。
其他的特点包括:
声明时使用 || 替代 () 将输入参数括起来。
函数体定界符({})对于单个表达式是可选的,其他情况必须加上。
有能力捕获外部环境的变量。
定义闭包12345678910111213普通函数fn 函数名(参数列表) -> 返回值 { // 业务逻辑}// 闭包|参数列表| { // 业务逻辑}// 无参数闭包|| { // 业务逻辑}
从上面看,去掉了 fn,去掉了函数名,把参数用 2 个竖线。
闭包也可以赋值给一个变量,可以通过调用这个变量来完成闭包的调用。
123let 闭包变量 = |参数列表| { // 闭包的具体逻辑}
12345678910111213141516 let double = |x| { ...
rust-迭代器
27.迭代器迭代器 就是把集合中的所有元素按照顺序一个接一个的传递给处理逻辑。
Iterator 特质有两个函数:
一个是 iter(),用于返回一个 迭代器 对象,也称之为 项 ( items ) 。
一个是 next(),用于返回迭代器中的下一个元素。如果已经迭代到集合的末尾(最后一个项后面)则返回 None。
12345678910111213fn main() { let v = vec!["Go语言极简一本通", "Go语言微服务架构核心22讲", "从0到Go语言微服务架构师"]; let mut it = v.iter(); println!("{:?}",it.next()); println!("{:?}",it.next()); println!("{:?}",it.next()); println!("{:?} ...
rust-文件操作
26.文件操作Rust 语言使用结构体 File 来描述/展现一个文件。
所有对结构体 File 的操作方法都会返回一个 Result 枚举。
以下是一些常用的文件方法
模块
方法
说明
std::fs::File
open()
静态方法,以 只读 模式打开文件
std::fs::File
create()
静态方法,以 可写 模式打开文件。 如果文件存在则清空旧内容 如果文件不存在则新建
std::fs::remove_file
remove_file()
从文件系统中删除某个文件
std::fs::OpenOptions
append()
设置文件模式为 追加
std::io::Writes
write_all()
将 buf 中的所有内容写入输出流
std::io::Read
read_to_string()
读取所有内容转换为字符串后追加到 buf 中
打开文件模块提供了静态方法 open() 用于打开一个文件并返回文件句柄。
12let file = std::fs::File::open("data.txt" ...
rust-I/O操作
25 I/OI/O 就是输入(Input)/输出(Output)。Rust 语言 IO 输入输出的三大块内容:读取数据、写入数据、命令行参数。
读取和写入Rust 标准库 IO 输入输出以下 2 个 Trait
特质
说明
Read
用于从输入流读取字节数据
Write
用于向输出流中写入数据,包含字节数据和 UTF-8 数据两种格式
123456fn main() { let mut in_word = String::new(); let result = std::io::stdin().read_line(&mut in_word).unwrap(); println!("您的输入是: {}", in_word); println!("读取的字节数为: {}", result);}
std::io::stdin() 返回标准输入流 stdin 的句柄。read_line() 是标准入流 stdi ...
rust-泛型
24.泛型(Generic)泛型是运行时指定数据类型的一种机制。好处是通过高度的抽象,使用一套代码应用多种数据类型。比如我们的向量,可以使用数值类型,也可以使用字符串类型。泛型是可以保证数据安全和类型安全的,还同时减少代码量。
Rust 语言中的泛型主要包含 泛型集合、泛型结构体、泛型函数、范型枚举 和 特质 。
Rust 使用使用 <T> 语法来实现泛型, 其中 T 可以是任意数据类型。
泛型集合我们之前用过的向量。我们可以创建 i32 类型的,也可以创建字符串类型的,但是一旦确定了类型,就不能添加其他类型,否则报错。
12let mut v:Vec<i32> =vec![1,2,3];v.push("4");//此处会报错 ^^^ expected `i32`, found `&str`
说明向量需要的是 i32 类型的值,现在给了一个字符串。从这点看,泛型 让集合更通用,也更安全。
泛型结构体定义语法
123456789101112131415struct 结构体名称<T> { 元素:T, ...
rust-集合
23.集合 CollectionsRust 语言标准库提供了通用的数据结构的实现。包括 向量 (Vector)、哈希表( HashMap )、哈希集合( HashSet ) 。
向量 (Vector)Rust 在标准库中定义了结构体 Vec 用于表示一个向量。向量和数组很相似,只是数组长度是编译时就确定了,定义后就不能改变了,那要么改数组,让他支持可变长度,显然 Rust 没有这么做,它用向量这个数据结构,也是在内存中开辟一段连续的内存空间来存储元素。
特点:
向量中的元素都是相同类型元素的集合。
长度可变,运行时可以增加和减少。
使用索引查找元素。(索引从 0 开始)
添加元素时,添加到向量尾部。
向量的内存在堆上,长度可动态变化。
创建向量
new() 静态方法用于创建一个结构体 Vec 的实例。
1let mut 向量的变量名称 = Vec::new();
vec!() 宏来简化向量的创建。
1let 向量的变量名称 = vec![val1,val2,...]
向量的使用方法
方法
说明
new()
创建一个空的向量的实例
push()
将某个值 T ...
rust-枚举
22.Enum(枚举)枚举 enum 关键字允许创建一个从数个不同取值中选其一的枚举类型(enumeration)。任何一个在 struct 中合法的取值在 enum 中也合法。
在日常生活中很常见。比如:1 年有 12 个月,1 周有 7 天。
枚举的定义12345enum 枚举名称{ variant1, variant2, ...}
使用枚举123456789101112131415枚举名称::variant#[derive(Debug)]enum RoadMap { Go语言极简一本通, Go语言微服务架构核心22讲, 从0到Go语言微服务架构师,}//这是Go语言学习3个阶段fn main() { let level = RoadMap::从0到Go语言微服务架构师; println!("level---{:?}",level);}
#[derive(Debug)] 注解的作用,就是让 派生自Debug`。
Option 枚举1234enu ...
rust-结构体
21.结构体(Struct)结构体( struct )可以由各种不同类型组成。使用 struct 关键字来创建。struct 是 structure 的缩写。结构体可以作为另一个结构体的字段。结构体是可以嵌套的。
元组结构体(tuple struct),事实上就是具名元组而已。
1struct Pair(String, i32);
经典的 C 语言风格结构体(C struct)。
123struct 结构体名称 { ...}
单元结构体(unit struct),不带字段,在泛型中很有用。
1struct Unit;
定义结构体12345struct 结构体名称 { 字段1:数据类型, 字段2:数据类型, ...}
创建结构体实例12345let 实例名称 = 结构体名称{ field1:value1, field2:value2 ...};
结构体初始化,其实就是对 结构体中的各个元素进行赋值。
12345678910111213141516#[derive(Debug)] ...