解锁 Rust 开发新可能:从系统内核到 Web 前端的全栈革命

Rust 自 2010 年首次发布以来,凭借 "内存安全而不牺牲性能" 的核心优势,已从一门小众系统语言成长为横跨系统开发、Web 服务、嵌入式设备、AI 推理等多领域的 "全栈语言"。其独特的所有权系统、零成本抽象和并发安全特性,正在重新定义开发者对 "安全" 与 "性能" 的认知。本文将深入探索 Rust 在各领域的突破性应用,通过代码实例、流程图、对比分析和实践指南,展示如何用 Rust 解锁开发新可能。

一、Rust 核心优势:为何它能颠覆传统开发范式?

Rust 的崛起并非偶然,其设计哲学直指传统编程语言的痛点。理解这些核心优势,是掌握 Rust 开发新可能的基础。

1.1 内存安全:无需 GC 的 "零漏洞" 保障

传统系统语言(如 C/C++)的内存安全问题(缓冲区溢出、悬垂指针等)是 70% 以上安全漏洞的根源,而 Java、Python 等语言依赖垃圾回收(GC)保障安全,却牺牲了性能和实时性。

Rust 的所有权系统通过编译期检查实现内存安全,无需运行时开销:

  • 所有权规则:每个值有且仅有一个所有者,离开作用域自动释放
  • 借用规则:同一时间要么有多个不可变借用,要么有一个可变借用
  • 生命周期:编译器自动推断引用的有效范围,避免悬垂引用

代码示例:所有权与借用的编译期安全检查

rust

复制代码
fn main() {
    // 字符串 s 拥有其数据的所有权
    let s = String::from("hello");
    
    // 传递所有权(s 此后失效)
    let s2 = s;
    // println!("{}", s); // 编译错误:s 已失去所有权
    
    // 不可变借用(只读访问)
    let s3 = String::from("world");
    let r1 = &s3;
    let r2 = &s3; // 允许多个不可变借用
    println!("{} {}", r1, r2);
    
    // 可变借用(独占修改权)
    let mut s4 = String::from("rust");
    let r3 = &mut s4;
    // let r4 = &mut s4; // 编译错误:同一时间只能有一个可变借用
    r3.push_str(" is safe");
    println!("{}", r3);
}

mermaid 流程图:Rust 所有权检查流程

graph TD

A[创建变量] --> B{是否转移所有权?};

B -->|是| C[原变量失效, 新变量获得所有权];

B -->|否| D{是否创建引用?};

D -->|不可变引用| E[允许多个引用, 禁止修改];

D -->|可变引用| F[仅允许一个引用, 允许修改];

E & F --> G[引用超出作用域, 所有权不变];

C & G --> H[变量超出作用域, 自动释放内存];

1.2 并发安全:天生避免数据竞争

多线程开发中,数据竞争(多个线程同时读写共享数据)是最难调试的问题之一。Rust 通过类型系统在编译期杜绝数据竞争:

  • Send trait:标记类型可安全跨线程转移所有权
  • Sync trait:标记类型可安全跨线程共享(即 &TSend
  • 无锁数据结构(如 std::sync::Arc + Mutex)的类型安全封装

代码示例:安全的多线程数据共享

rust

复制代码
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // Arc 实现原子引用计数(线程安全的共享所有权)
    // Mutex 确保同一时间只有一个线程访问数据
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let counter = Arc::clone(&counter); // 克隆 Arc(增加引用计数)
        let handle = thread::spawn(move || {
            let mut num = counter.lock().unwrap(); // 获取锁(独占访问)
            *num += 1;
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }

    println!("Result: {}", *counter.lock().unwrap()); // 输出 10(无数据竞争)
}

1.3 零成本抽象:性能与开发效率的平衡

Rust 的 "抽象" 不会带来额外运行时开销,这使其既能像 C 一样接近硬件,又能像 Python 一样写出简洁代码。例如:

  • 泛型:编译期单态化,生成针对性代码(无虚函数开销)
  • 迭代器:编译为高效循环(与手写 for 循环性能一致)
  • 模式匹配:编译为跳转表(比 if-else 链更高效)

代码示例:迭代器的零成本抽象

rust

复制代码
fn main() {
    let numbers = vec![1, 2, 3, 4, 5];
    
    // 迭代器链式调用(简洁易读)
    let sum: i32 = numbers
        .iter()
        .filter(|&&x| x % 2 == 0) // 过滤偶数
        .map(|&x| x * 2) // 翻倍
        .sum(); // 求和
    
    println!("Sum: {}", sum); // 输出 12(2*2 + 4*2)
}
// 编译后等价于:
// let mut sum = 0;
// for &x in numbers.iter() {
//     if x % 2 == 0 {
//         sum += x * 2;
//     }
// }

二、系统开发:从内核模块到高性能工具

Rust 正在重塑系统开发的边界。凭借与硬件的紧密交互能力和内存安全保障,它已被用于开发操作系统内核、驱动程序和高性能工具。

2.1 操作系统内核开发:更安全的底层基石

传统内核开发依赖 C 语言,频繁面临内存漏洞风险。Rust 已被 Linux 内核、Windows 驱动框架和自研内核(如 Redox OS)采纳,显著降低漏洞率。

代码示例:简化的 Rust 内核打印功能

rust

复制代码
// 内核级打印(直接操作 VGA 文本缓冲区)
const VGA_BUFFER: *mut u8 = 0xb8000 as _; // VGA 缓冲区地址(x86 实模式)
const SCREEN_WIDTH: usize = 80;
const SCREEN_HEIGHT: usize = 25;

pub struct VgaWriter {
    column_position: usize,
    color_code: u8,
    buffer: &'static mut [[u8; 2]; SCREEN_HEIGHT * SCREEN_WIDTH],
}

impl VgaWriter {
    // 初始化 VGA 写入器
    pub fn new() -> Self {
        Self {
            column_position: 0,
            color_code: 0x0f, // 白色文字 + 黑色背景
            buffer: unsafe { &mut *(VGA_BUFFER as *mut [[u8; 2]; SCREEN_HEIGHT * SCREEN_WIDTH]) },
        }
    }

    // 写入字符
    pub fn write_char(&mut self, c: u8) {
        match c {
            b'\n' => self.new_line(), // 换行
            c => {
                if self.column_position >= SCREEN_WIDTH {
                    self.new_line();
                }
                let row = 0; // 简化:只写第一行
                let idx = row * SCREEN_WIDTH + self.column_position;
                self.buffer[idx] = [c, self.color_code]; // [字符, 颜色]
                self.column_position += 1;
            }
        }
    }

    // 换行逻辑
    fn new_line(&mut self) {
        self.column_position = 0;
        // 实际实现需滚动屏幕,此处简化
    }
}

// 实现 fmt::Write  trait,支持 println! 宏
use core::fmt;
impl fmt::Write for VgaWriter {
    fn write_str(&mut self, s: &str) -> fmt::Result {
        for c in s.bytes() {
            self.write_char(c);
        }
        Ok(())
    }
}

2.2 高性能命令行工具:替代 Python/Bash 的新选择

Rust 编写的命令行工具兼具 Python 的开发效率和 C 的运行速度。例如:

  • exa:替代 ls(更丰富的功能和更快的速度)
  • bat:替代 cat(语法高亮和 Git 集成)
  • ripgrep:替代 grep(多线程搜索,速度提升 10x+)

代码示例:用 Rust 实现简易文件搜索工具

rust

复制代码
use clap::Parser;
use walkdir::WalkDir;
use std::fs::File;
use std::io::{self, BufRead};

// 命令行参数解析(使用 clap 库)
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Args {
    /// 搜索的目录
    #[arg(default_value = ".")]
    dir: String,

    /// 目标关键词
    pattern: String,
}

fn main() -> io::Result<()> {
    let args = Args::parse();
    
    // 遍历目录下的所有文件
    for entry in WalkDir::new(&args.dir).into_iter().filter_map(|e| e.ok()) {
        if entry.file_type().is_file() {
            // 读取文件内容并搜索关键词
            if let Ok(file) = File::open(entry.path()) {
                for (line_num, line) in io::BufReader::new(file).lines().enumerate() {
                    let line = line?;
                    if line.contains(&args.pattern) {
                        println!(
                            "{}:{}: {}",
                            entry.path().display(),
                            line_num + 1,
                            line
                        );
                    }
                }
            }
        }
    }
    
    Ok(())
}

使用方法

bash

复制代码
# 安装依赖
cargo add clap walkdir

# 编译运行(搜索当前目录下含 "rust" 的文件行)
cargo run -- --dir . rust

三、Web 开发:从后端服务到前端交互的全栈方案

Rust 正在 Web 领域快速渗透:后端可构建高性能服务,前端可通过 WebAssembly(Wasm)实现接近原生的交互体验。

3.1 后端服务:比 Go 更快,比 Node.js 更安全

Rust 的 Web 框架(如 Axum、Actix-web)凭借异步 runtime(Tokio)和内存安全,在高并发场景下表现优异:

  • 吞吐量比 Node.js 高 2-5 倍
  • 内存占用仅为 Java Spring 的 1/10
  • 天然防御 SQL 注入、XSS 等 Web 攻击

代码示例:用 Axum 构建 RESTful API

rust

复制代码
use axum::{
    routing::{get, post},
    http::StatusCode,
    response::IntoResponse,
    Json, Router,
};
use serde::{Deserialize, Serialize};
use std::net::SocketAddr;

// 定义数据模型
#[derive(Debug, Serialize, Deserialize)]
struct Todo {
    id: u64,
    title: String,
    completed: bool,
}

// 内存存储(实际项目用数据库)
static mut TODOS: Vec<Todo> = vec![];
static mut NEXT_ID: u64 = 1;

// 获取所有 Todo
async fn get_todos() -> impl IntoResponse {
    let todos = unsafe { TODOS.clone() }; // 简化:实际需用锁保护共享数据
    Json(todos)
}

// 创建新 Todo
async fn create_todo(Json(todo): Json<Todo>) -> impl IntoResponse {
    let mut new_todo = todo;
    unsafe {
        new_todo.id = NEXT_ID;
        NEXT_ID += 1;
        TODOS.push(new_todo.clone());
    }
    (StatusCode::CREATED, Json(new_todo))
}

#[tokio::main]
async fn main() {
    // 路由配置
    let app = Router::new()
        .route("/todos", get(get_todos))
        .route("/todos", post(create_todo));

    // 启动服务
    let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
    println!("Server running on http://{}", addr);
    axum::Server::bind(&addr)
        .serve(app.into_make_service())
        .await
        .unwrap();
}

测试 API

bash

复制代码
# 创建 Todo
curl -X POST http://localhost:3000/todos \
  -H "Content-Type: application/json" \
  -d '{"title":"Learn Rust Web","completed":false}'

# 获取所有 Todo
curl http://localhost:3000/todos

3.2 前端交互:WebAssembly 桥接 Rust 与 JavaScript

Rust 编译为 WebAssembly 后,可直接在浏览器中运行,解决 JavaScript 性能瓶颈(如图像处理、复杂计算)。

工作流程

graph LR

A[Rust 代码] --> B[cargo build --target wasm32-unknown-unknown];

B --> C[生成 .wasm 二进制文件];

C --> D[通过 wasm-bindgen 生成 JS 绑定];

D --> E[浏览器/Node.js 调用 Rust 函数];

代码示例:Rust 与 JS 交互(计算斐波那契数列)

  1. Rust 部分(fib.rs

rust

复制代码
use wasm_bindgen::prelude::*;

// 标记为可被 JS 调用
#[wasm_bindgen]
pub fn fib(n: u32) -> u32 {
    match n {
        0 => 0,
        1 => 1,
        _ => fib(n - 1) + fib(n - 2),
    }
}

// 从 JS 接收字符串并处理
#[wasm_bindgen]
pub fn process_string(s: &str) -> String {
    s.to_uppercase()
}
  1. 配置 Cargo.toml

toml

复制代码
[package]
name = "wasm_demo"
version = "0.1.0"

[dependencies]
wasm-bindgen = "0.2"
  1. 编译与生成绑定

bash

复制代码
# 安装目标平台
rustup target add wasm32-unknown-unknown

# 安装构建工具
cargo install wasm-pack

# 构建(生成 pkg 目录,含 JS 绑定和 .wasm)
wasm-pack build --target web
  1. HTML/JS 调用

html

预览

复制代码
<!DOCTYPE html>
<script type="module">
    // 导入 Rust 生成的模块
    import init, { fib, process_string } from './pkg/wasm_demo.js';

    async function run() {
        await init(); // 初始化 Wasm
        
        // 调用 Rust 函数
        console.log('fib(10) =', fib(10)); // 输出 55
        console.log('uppercase:', process_string('hello rust')); // 输出 "HELLO RUST"
    }
    
    run();
</script>

四、嵌入式开发:资源受限设备的安全首选

Rust 正在成为嵌入式开发的新标杆。其内存安全特性可避免嵌入式系统中常见的崩溃问题,同时零成本抽象适合资源受限设备(如 MCU、传感器)。

4.1 硬件交互:直接操作寄存器

Rust 可通过 volatile 操作和内存映射直接访问硬件寄存器,与 C 语言具有同等控制力。

代码示例:STM32 单片机点亮 LED(简化版)

rust

复制代码
// 内存映射:STM32 的 GPIO 寄存器地址
const GPIOC_BASE: u32 = 0x40011000;
const GPIO_MODER: *mut u32 = (GPIOC_BASE + 0x00) as _; // 模式寄存器
const GPIO_ODR: *mut u32 = (GPIOC_BASE + 0x14) as _; // 输出数据寄存器

// LED 连接到 PC13 引脚
const LED_PIN: u32 = 13;

fn main() {
    // 配置 PC13 为输出模式(MODER 寄存器:01 = 输出)
    unsafe {
        let moder = GPIO_MODER.read_volatile();
        // 清除原有配置(2 位一组)
        let moder = moder & !(0b11 << (LED_PIN * 2));
        // 设置为输出模式
        GPIO_MODER.write_volatile(moder | (0b01 << (LED_PIN * 2)));
    }

    // 循环闪烁 LED
    loop {
        // 点亮 LED(ODR 寄存器对应位设为 1)
        unsafe { GPIO_ODR.write_volatile(1 << LED_PIN); }
        delay(1_000_000);
        
        // 熄灭 LED(对应位设为 0)
        unsafe { GPIO_ODR.write_volatile(0); }
        delay(1_000_000);
    }
}

// 简单延时函数(依赖 CPU 频率)
fn delay(cycles: u32) {
    for _ in 0..cycles {
        core::hint::spin_loop(); // 防止编译器优化掉空循环
    }
}

4.2 嵌入式框架:简化开发流程

Rust 社区已推出成熟的嵌入式框架,如 embedded-hal(硬件抽象层)、stm32f4xx-hal(STM32F4 系列驱动)等,大幅降低开发难度。

代码示例:使用 embedded-hal 读取传感器数据

rust

复制代码
use embedded_hal::i2c::I2c;
use linux_embedded_hal::I2cdev; // 适用于开发板/模拟器
use sht3x::{self, Sht3x}; // SHT3x 温湿度传感器驱动

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 初始化 I2C 总线(如 Raspberry Pi 的 /dev/i2c-1)
    let i2c = I2cdev::new("/dev/i2c-1")?;
    
    // 初始化传感器(I2C 地址 0x44)
    let mut sensor = Sht3x::new(i2c, 0x44);
    
    // 读取温湿度数据
    let (temp, humidity) = sensor.read_measurement()?;
    
    println!("Temperature: {:.2} °C", temp);
    println!("Humidity: {:.2} %", humidity);
    
    Ok(())
}

五、AI 与机器学习:高性能推理的新引擎

Rust 虽非 AI 训练的主流语言,但其在推理引擎开发和高性能计算中的潜力正被释放。

5.1 模型推理:比 Python 快 10-100 倍

通过 tch-rs(PyTorch Rust 绑定)或 tract(ONNX 推理引擎),Rust 可直接运行预训练模型,适合生产环境的低延迟推理。

代码示例:用 tch-rs 运行 ResNet-18 图像分类

rust

复制代码
use tch::{nn, Device, Kind, Tensor};
use image::ImageBuffer;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // 加载预训练的 ResNet-18 模型
    let device = Device::Cpu; // 或 Device::Cuda(0) 启用 GPU
    let mut vs = nn::VarStore::new(device);
    let resnet = tch::vision::resnet::resnet18(&vs.root(), 1000, false);
    vs.load("resnet18.ot")?; // 加载模型权重(需提前下载)

    // 加载并预处理图像(224x224 RGB)
    let img = image::open("cat.jpg")?
        .resize(224, 224, image::imageops::FilterType::Triangle)
        .to_rgb8();
    
    // 转换为 Tensor(标准化:均值 [0.485, 0.456, 0.406], 标准差 [0.229, 0.224, 0.225])
    let tensor = Tensor::from_slice(&img.as_raw()[..])
        .view((1, 224, 224, 3))
        .permute(&[0, 3, 1, 2]) // 转换为 (batch, channel, height, width)
        .to_device(device)
        .to_kind(Kind::Float)
        .div(255.0)
        .sub(&Tensor::from_slice(&[0.485, 0.456, 0.406]).view((1, 3, 1, 1)))
        .div(&Tensor::from_slice(&[0.229, 0.224, 0.225]).view((1, 3, 1, 1)));

    // 推理并获取 top-5 结果
    let output = resnet.forward(&tensor);
    let probabilities = output.softmax(-1, Kind::Float);
    let (values, indices) = probabilities.topk(5, 1, true, true);

    // 打印结果(需配合 ImageNet 标签文件)
    let labels = include_str!("imagenet_labels.txt").split('\n').collect::<Vec<_>>();
    for (i, (&val, &idx)) in values.iter::<f32>().zip(indices.iter::<i64>()).enumerate() {
        println!("Top {}: {} ({:.2}%)", i+1, labels[idx as usize], val * 100.0);
    }

    Ok(())
}

5.2 高性能计算:并行加速矩阵运算

Rust 的 rayon 库提供简单的并行迭代器,可轻松加速机器学习中的矩阵运算和数据预处理。

代码示例:并行计算矩阵乘法

rust

复制代码
use rayon::prelude::*;

// 矩阵类型:Vec<Vec<f64>>
type Matrix = Vec<Vec<f64>>;

// 串行矩阵乘法
fn multiply_serial(a: &Matrix, b: &Matrix) -> Matrix {
    let n = a.len();
    let mut result = vec![vec![0.0; n]; n];
    for i in 0..n {
        for j in 0..n {
            for k in 0..n {
                result[i][j] += a[i][k] * b[k][j];
            }
        }
    }
    result
}

// 并行矩阵乘法(行并行)
fn multiply_parallel(a: &Matrix, b: &Matrix) -> Matrix {
    let n = a.len();
    (0..n)
        .into_par_iter() // 并行迭代行
        .map(|i| {
            let mut row = vec![0.0; n];
            for j in 0..n {
                for k in 0..n {
                    row[j] += a[i][k] * b[k][j];
                }
            }
            row
        })
        .collect()
}

fn main() {
    // 生成 100x100 随机矩阵
    let a: Matrix = (0..100).map(|_| (0..100).map(|_| rand::random()).collect()).collect();
    let b: Matrix = (0..100).map(|_| (0..100).map(|_| rand::random()).collect()).collect();

    // 测试性能
    let start = std::time::Instant::now();
    let _ = multiply_serial(&a, &b);
    println!("Serial: {:?}", start.elapsed());

    let start = std::time::Instant::now();
    let _ = multiply_parallel(&a, &b);
    println!("Parallel: {:?}", start.elapsed()); // 多核 CPU 下快 3-8 倍
}

六、跨平台开发:一次编写,全平台运行

Rust 支持编译到 Windows、macOS、Linux、Android、iOS 等几乎所有平台,配合 Tauri 等框架,可构建轻量、安全的跨平台应用。

6.1 Tauri:替代 Electron 的轻量方案

Tauri 用 Rust 替代 Electron 中的 Node.js 作为后端,前端仍用 HTML/CSS/JS,优势在于:

  • 安装包体积小(通常 < 10MB,Electron 多为 100MB+)
  • 内存占用低(无 V8 引擎 overhead)
  • 原生安全(Rust 隔离前端与系统 API)

Tauri 应用开发流程

复制代码
graph TD
    A[创建项目] -->|cargo install tauri-cli| B[tauri init];
    B --> C[编写前端界面];
    C --> D[Rust 实现后端逻辑];
    D --> E[定义前端-后端通信接口];
    E --> F[tauri build 编译全平台安装包];

代码示例:Tauri 前后端通信

  1. Rust 后端(src-tauri/src/main.rs)

rust

复制代码
use tauri::Manager;

#[tauri::command]
fn greet(name: &str) -> String {
    format!("Hello, {}! From Rust", name)
}

fn main() {
    tauri::Builder::default()
        .invoke_handler(tauri::generate_handler![greet]) // 注册命令
        .run(tauri::generate_context!())
        .expect("error while running tauri application");
}
  1. 前端调用(src/App.js)

javascript

运行

复制代码
import { invoke } from '@tauri-apps/api/tauri';

async function handleGreet() {
    const name = document.getElementById('name-input').value;
    const result = await invoke('greet', { name }); // 调用 Rust 命令
    alert(result);
}

// HTML 中添加:
// <input id="name-input" />
// <button onclick="handleGreet()">Greet</button>

七、Rust 开发效率提升:工具与 Prompt 实践

Rust 虽以 "难学" 著称,但借助现代工具和 AI 辅助,可大幅降低学习成本。

7.1 必备开发工具

工具 功能
cargo 构建系统与包管理器(类似 npm/maven)
rustfmt 代码格式化工具(保持风格一致)
clippy 静态分析工具(发现潜在问题)
rust-analyzer IDE 插件(代码补全、重构)
cargo-edit 命令行编辑 Cargo.toml(如 cargo add serde

7.2 AI 辅助开发:Prompt 示例

利用 GPT 等工具加速 Rust 开发,以下是实用 Prompt:

  1. 代码优化

plaintext

复制代码
请优化这段 Rust 代码的性能,减少内存分配和克隆操作:

fn process_data(data: &[u8]) -> Vec<u8> {
    let mut result = Vec::new();
    for &byte in data {
        let transformed = byte * 2;
        result.push(transformed);
    }
    result
}
  1. 调试帮助

plaintext

复制代码
这段 Rust 代码编译报错,如何修复?

error[E0597]: `s` does not live long enough
  --> src/main.rs:5:10
   |
4  |     let r = &s;
   |             -- borrow of `s` occurs here
5  |     s = String::from("world");
   |     ^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `s` occurs here
6  |     println!("{}", r);
   |                    - borrow later used here

fn main() {
    let mut s = String::from("hello");
    let r = &s;
    s = String::from("world");
    println!("{}", r);
}
  1. 最佳实践

plaintext

复制代码
在 Rust 中实现一个线程安全的计数器,需要支持多线程并发递增,应使用哪些标准库类型?请提供完整代码示例并解释原理。

八、Rust 生态与未来趋势

Rust 生态系统正以惊人速度增长,截至 2025 年:

  • crates.io(Rust 包仓库)拥有超过 10 万个包
  • 主要科技公司(Google、Microsoft、Amazon、Meta)均大规模采用
  • 新增领域:区块链(Solana 链用 Rust 开发)、自动驾驶(安全关键系统)

未来趋势预测:

  1. WebAssembly 深度整合:浏览器原生支持更多 Rust 特性,前端性能瓶颈进一步突破
  2. AI 推理标准化:Rust 可能成为边缘设备 AI 推理的默认语言
  3. 操作系统普及:更多内核和驱动采用 Rust,降低安全漏洞
  4. 开发体验优化:编译器错误提示更友好,学习曲线变缓

结语:解锁 Rust 新可能,从现在开始

Rust 不仅是一门语言,更是一种全新的开发思维 ------ 在不妥协性能的前提下,将 "安全" 与 "可靠" 融入代码基因。无论是系统内核、Web 服务、嵌入式设备还是 AI 推理,Rust 都在重新定义各领域的开发标准。

相关推荐
ZJU_统一阿萨姆4 小时前
Windows系统VSCode配置Rust开发环境(超详细保姆级教程)
windows·vscode·rust
知新坊4 小时前
RustDesk 完整部署教程:支持 Web 管理后台和网页客户端远程,保姆级教学来了!
前端
大雨淅淅4 小时前
【编程语言】Rust 入门
开发语言·后端·rust
桃花键神4 小时前
【送书福利-第四十四期】《 深入Rust标准库》
开发语言·后端·rust
像风一样自由20204 小时前
使用Rust构建高性能文件搜索工具
开发语言·后端·rust
墨咖4 小时前
java实现NTP服务以及服务调用端(Client)功能
java·开发语言·时间同步·ntp·时钟源同步
敲敲了个代码5 小时前
UniApp 多页面编译优化:编译时间从10分钟到1分钟
开发语言·前端·javascript·学习·uni-app
新建文件夹-5 小时前
深入浅出Langchain4j——构建Java大语言模型应用的新范式
java·开发语言·语言模型
景彬5 小时前
小红书小组件开发 最早踩坑版
前端·微信小程序