面试题答案
一键面试use std::error::Error;
use std::fmt;
use std::sync::Arc;
use log::{info, error};
use tokio::sync::Mutex;
// 模拟错误类型
#[derive(Debug)]
struct MyError;
impl fmt::Display for MyError {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "My custom error")
}
}
impl Error for MyError {}
// 模拟异步函数
async fn fetch_data() -> Result<Option<Vec<u8>>, MyError> {
// 模拟异步操作
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
Ok(Some(vec![1, 2, 3]))
}
// 处理异步返回值的函数
async fn handle_fetch_data() -> Vec<u8> {
match fetch_data().await {
Ok(Some(data)) => data,
Ok(None) => {
info!("Option is None, using default value");
Vec::new()
},
Err(e) => {
error!("Error occurred: {}", e);
Vec::new()
}
}
}
你可以这样调用这个函数:
#[tokio::main]
async fn main() {
let result = handle_fetch_data().await;
println!("Final result: {:?}", result);
}
解释:
fetch_data
是模拟的异步函数,返回Result<Option<Vec<u8>>, MyError>
。handle_fetch_data
使用match
表达式来处理fetch_data
的返回值。如果是Ok(Some(data))
,则直接返回数据;如果是Ok(None)
,记录日志并返回默认的空Vec<u8>
;如果是Err(e)
,记录错误日志并返回默认的空Vec<u8>
。- 在
main
函数中,通过tokio::main
宏来异步执行handle_fetch_data
函数,并打印最终结果。
这样的实现考虑了异步执行过程中的资源管理和性能优化,match
表达式是一种高效处理 Result
和 Option
的方式,并且使用 log
库进行日志记录。同时,tokio::main
宏确保异步代码在合适的运行时环境中执行。