龙空技术网

Rust-指针安全的底层编程语言,从Hello Word到一个简单的web后端

新新码农 106

前言:

目前咱们对“c后端语言”大约比较讲究,各位老铁们都需要分析一些“c后端语言”的相关知识。那么小编同时在网摘上网罗了一些有关“c后端语言””的相关内容,希望姐妹们能喜欢,你们快快来学习一下吧!

Rust特点和主要使用场景

Rust是一种系统级编程语言,由Mozilla开发并于2010年首次亮相。它旨在提供高性能、安全、并发的编程体验。下面是Rust的几个特点和使用场景:

特点:

内存安全性:Rust在编译时强制执行内存安全规则,避免了常见的内存安全问题(例如空指针、缓冲区溢出、野指针等),这使得Rust可以避免大量的安全漏洞。零成本抽象:Rust提供了高级抽象机制,如trait、泛型等,同时也没有运行时开销。这使得Rust可以提供高性能的代码,而不会因为语言本身的开销而受到影响。并发安全性:Rust的类型系统和所有权系统使得多线程编程变得更加容易。在Rust中,数据的所有权只能被一个线程所持有,因此并发问题可以在编译期间被捕获。

使用场景:

系统编程:Rust的安全和高性能特性使其成为开发操作系统、网络协议、编译器和数据库等系统级软件的理想选择。Web后端:Rust的高性能和并发安全性使其成为构建高性能Web服务器的良好选择。数据科学:Rust提供了许多用于数据科学的库,如numpy、pandas等,这些库可以提供与Python相似的数据处理功能,但更快,更安全。嵌入式设备:Rust可以编译为裸机代码,因此可以在嵌入式设备中使用。它的安全性和高性能特性也使其成为嵌入式设备编程的良好选择。游戏开发:Rust可以用于游戏开发,因为它提供了与C++相似的性能,同时具有更好的内存安全性和并发性。区块链:Rust的高性能和内存安全性使其成为区块链开发的良好选择。物联网(IoT):Rust可以编译为裸机代码,因此可以在物联网设备中使用。它的内存安全性和并发性使其成为开发物联网设备的良好选择。安全工具:由于Rust的内存安全性,许多安全工具(例如漏洞扫描器、加密库等)使用Rust来减少安全漏洞。Rust和其他语言对比

Rust是一种系统级编程语言,与其他编程语言相比具有以下优点和不同之处:

内存安全性:与C/C++相比,Rust提供了更好的内存安全性。Rust的所有权系统和类型系统使得在编译期间就能够发现许多常见的内存错误,例如空指针和野指针。这可以减少应用程序中出现的内存漏洞和安全漏洞的数量。零成本抽象:Rust具有与C++相似的抽象机制,例如trait、泛型等,但不会因此带来额外的运行时开销。这使得Rust可以提供高性能的代码。并发安全性:Rust的所有权和类型系统使得编写并发代码更加容易和安全。Rust可以保证在编译期间捕获大多数常见的并发错误。社区支持:Rust的社区不断增长,越来越多的人开始使用Rust进行系统级编程、Web开发、游戏开发等等。Rust的生态系统也在不断增长,有越来越多的库和工具可用于Rust开发。

与其他语言相比,Rust的缺点包括:

学习曲线:由于Rust的所有权和借用系统等特性,Rust的学习曲线可能相对陡峭,需要一些时间来适应。性能:尽管Rust的性能通常很好,但在某些情况下,其他语言(如C++)可能会提供更高的性能。生态系统:尽管Rust的生态系统正在迅速增长,但它可能不像其他语言(例如Python或JavaScript)那样成熟和完整。Hello World

如何使用Rust编写和运行Hello World程序:

1.安装Rust编程语言:可以在Rust官网 上下载和安装Rust编程语言。在Windows上使用Rust安装程序,linux上使用下面命令安装

curl --proto '=https' --tlsv1.2 -sSf <; | sh

2.创建一个新的Rust项目:使用命令行,进入想要创建新Rust项目的文件夹,并输入以下命令:

cargo new hello_world

这将创建一个新的名为“hello\_world”的Rust项目,并在其中包含一个Cargo.toml文件和一个src/main.rs文件。

3.编写Hello World程序:使用任何文本编辑器,打开“src/main.rs”文件,并将以下代码复制到文件中:

fn main() {    println!("Hello, world!");}

这是一个非常简单的程序,它将输出“Hello, world!”消息到控制台。

4.编译并运行程序:使用命令行,进入“hello_world”项目的根目录,并输入以下命令:

cargo run

这将使用Rust的构建工具Cargo编译和运行你的程序。在控制台上,应该会看到“Hello, world!”输出。

用Rust写一个简单的web后端应用创建一个新的Rust项目:使用命令行,进入想要创建新Rust项目的文件夹,并输入以下命令:cargo new web_app --bin这将创建一个新的名为“web\_app”的Rust项目,并在其中包含一个Cargo.toml文件和一个src/main.rs文件。添加必要的依赖:在“Cargo.toml”文件中添加以下依赖:[dependencies] actix-web = "4" tokio = { version = "1", features = ["full"] }这些依赖包括actix-web框架和tokio异步运行时。编写Web应用程序:使用任何文本编辑器,打开“src/main.rs”文件,并将以下代码复制到文件中:use actix_web::{get, App, HttpResponse, HttpServer, Responder}; #[get("/")] async fn index() -> impl Responder { HttpResponse::Ok().body("Hello, world!") } #[actix_web::main] async fn main() -> std::io::Result<()> { HttpServer::new(|| { App::new() .service(index) }) .bind("127.0.0.1:8080")? .run() .await }这是一个非常简单的Web应用程序,它将响应HTTP GET请求并输出“Hello, world!”消息。编译并运行程序:使用命令行,进入“web_app”项目的根目录,并输入以下命令:cargo run这将使用Rust的构建工具Cargo编译和运行的程序。在控制台上,应该会看到“Listening on “输出。]测试Web应用程序:打开Web浏览器,并在地址栏中输入“”。就应该能够看到浏览器中显示“Hello, world!”消息。下面为刚才的程序增加使用postgres数据库查询的功能

0.首先需要确保已经安装了PostgreSQL数据库,并且已经创建了一个数据库和用户,该用户具有对该数据库的访问权限。

我这里使用的是用户名:postgres,密码:123456,数据库:database,表:user,表中有一列name用来表示用户的名称

1.添加PostgreSQL数据库依赖:在“Cargo.toml”文件中添加以下依赖:

[dependencies]actix-web = "4"tokio = { version = "1", features = ["full"] }postgres = "0.19.4"tokio-postgres = { version = "0.7.7" }

这些依赖包括actix-web框架、tokio异步运行时和sqlx数据库框架的PostgreSQL驱动。

2.连接数据库:在“src/main.rs”文件中添加以下代码,连接到PostgreSQL数据库:

use tokio_postgres::{NoTls, Error};async fn get_data() -> Result<Vec<String>, Error> {    let (client, connection) =        tokio_postgres::connect("host=localhost user=postgres password=123456 dbname=database", NoTls).await?;    tokio::spawn(async move {        if let Err(e) = connection.await {            eprintln!("connection error: {}", e);        }    });    let rows = client        .query("SELECT * FROM public.user", &[])        .await?;    let mut result = Vec::new();    for row in &rows {        let value: String = row.get("name");        result.push(value);    }    Ok(result)}

3.添加数据库查询功能:在“src/main.rs”文件中添加以下代码,执行数据库查询操作:

#[get("/data")]async fn get_data_handler() -> impl Responder {    match get_data().await {        Ok(result) => HttpResponse::Ok().json(result),        Err(e) => {            eprintln!("error getting data: {}", e);            HttpResponse::InternalServerError().finish()        }    }}

这个函数将查询PostgreSQL数据库中的“users”表,并将结果作为JSON格式的HTTP响应返回。

4.修改主函数:在“src/main.rs”文件中修改主函数

#[actix_web::main]async fn main() -> std::io::Result<()> {    HttpServer::new(|| {        App::new()            .service(get_data_handler)    })    .bind("127.0.0.1:8080")?    .run()    .await}

这个函数将调用“connect_to_db”函数来创建数据库连接池对象,并将其作为应用程序数据添加。

5.最终的“src/main.rs”类似这样:

use actix_web::{get, App, HttpResponse, HttpServer, Responder};use tokio_postgres::{NoTls, Error};async fn get_data() -> Result<Vec<String>, Error> {    let (client, connection) =        tokio_postgres::connect("host=localhost user=postgres password=123456 dbname=database", NoTls).await?;    tokio::spawn(async move {        if let Err(e) = connection.await {            eprintln!("connection error: {}", e);        }    });    let rows = client        .query("SELECT * FROM public.user", &[])        .await?;    let mut result = Vec::new();    for row in &rows {        let value: String = row.get("name");        result.push(value);    }    Ok(result)}#[get("/data")]async fn get_data_handler() -> impl Responder {    match get_data().await {        Ok(result) => HttpResponse::Ok().json(result),        Err(e) => {            eprintln!("error getting data: {}", e);            HttpResponse::InternalServerError().finish()        }    }}#[actix_web::main]async fn main() -> std::io::Result<()> {    HttpServer::new(|| {        App::new()            .service(get_data_handler)    })    .bind("127.0.0.1:8080")?    .run()    .await}

6.测试Web应用程序cargo run:打开Web浏览器,并在地址栏中输入“”。就应该能够看到浏览器中显示数据库内容。

标签: #c后端语言