面试题答案
一键面试发送端处理错误
在Rust中,Sender
的send
方法返回一个Result
类型,当通道关闭时,send
会返回一个Err
。可以通过match
语句来处理这个错误。例如:
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
let handle = thread::spawn(move || {
let data = String::from("Hello, Receiver!");
match tx.send(data) {
Ok(_) => println!("Data sent successfully"),
Err(e) => println!("Failed to send data: {}", e),
}
});
let received = rx.recv().unwrap();
println!("Received: {}", received);
handle.join().unwrap();
}
接收端处理错误
Receiver
的recv
方法同样返回一个Result
类型。当通道关闭且没有更多数据时,recv
会返回一个Err
。我们也可以用match
语句处理:
use std::sync::mpsc;
use std::thread;
fn main() {
let (tx, rx) = mpsc::channel();
let handle = thread::spawn(move || {
// 模拟发送完数据后关闭通道
tx.close();
});
match rx.recv() {
Ok(data) => println!("Received: {}", data),
Err(e) => println!("Failed to receive data: {}", e),
}
handle.join().unwrap();
}
在上述代码中,接收端使用match
处理recv
可能返回的错误,发送端通过tx.close()
关闭通道,模拟发送端关闭通道后接收端处理异常的情况。这样就能在通道关闭时,优雅地处理发送端和接收端的异常。