自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(144)
  • 收藏
  • 关注

原创 actix-web开发环境搭建

本文介绍了搭建actix web开发环境的核心步骤。主要内容包括:1) 引入actix-web和tokio运行时依赖;2) 创建基础项目结构;3) 编写简单的HTTP服务器示例代码。重点讲解了异步编程模型,如async/await、Future和tokio运行时的工作原理。示例代码展示了如何定义路由处理函数和启动服务器,并详细解析了HttpServer、App等核心组件的作用和使用方式。文章强调Rust采用协作式调度而非抢占式线程的异步模型特点。

2025-10-18 22:32:02 247

原创 Rust数据库与工具的选择

包编译时的安全性查询接口异步不支持SQL支持sqlx支持SQL支持diesel支持DSL不支持。

2025-10-15 20:38:14 1180 1

原创 在actix-web中创建一个提取器

特定格式(反)序列化信息在编译期即可完全确定,无需运行时查找,保证了高性能。

2025-10-15 17:52:51 922

原创 在actix-web应用用构建集成测试

run端点是否已正确暴露;是否使用了GET方法;是否返回了状态码200 OK;是否没有响应体(即一旦这些断言全部通过,就说明我们的健康检查端点工作正常。

2025-10-14 08:54:51 311

原创 使用 Actix Web 构建 Web 应用

在 Rust 中,#[tokio::main] 是一个非常常见但又容易被忽略的过程宏。当请求到达时,Actix Web 会按注册顺序遍历所有路由,第一个同时满足路径模板和守卫条件的路由将被选中,并调用其处理器。Rust 没有规定运行时标准接口,所以这就需要我们自己来启动一个运行时,然后在其中运行异步任务。在 main 函数中自动创建并启动一个 Tokio 运行时,然后在其中执行你的异步逻辑。是一个 异步方法,而在 Rust 中,只能在异步函数中调用异步函数。Rust 的 main 函数不能直接是异步的。

2025-10-13 19:44:39 997

原创 Rust开发环境搭建

在Windows操作系统中,需要安装C/C++工具,选择下载生成工具。接下来,选择使用C++的桌面开发。

2025-10-13 10:25:55 484

原创 Linux下的Rust 与 C 的互操作性解析

有时Rust需要与其他编程语言编写的程序或库通信,包括调用系统API等。尽管crates.io和Rust生态系统提供了很多功能。这就意味着你可能需要在某时离开Rust舒适区。Rust支持C。虽然有很多限制,但C ABI仍然是许多语言和操作系统的首选公共接口。C语言(或其他基于C的语言)已经存在超过50年了。因此用C/C++编写的应用程序涵盖了所有计算需求。互操作性为Rust开发者提供了对这一庞大库的访问能力。在不同语言交换数据是巨大的挑战,解决这些问题的方案是使用外部函数接口(FFI)。

2025-10-11 21:24:05 962 1

原创 Rust线程详解

在很多方面,进程内的线程就像住在一个房子里的多个家庭成员。他们必须共享资源,并且常常会无意中竞争这些资源。如果没有适当的协调,那么这可能会导致冲突和不可预测的行为。同样有时也需要线程同步。join和通道都为线程之间的协调提供了帮助。增加必要的同步有助于创建一个安全的环境,从而促使更多并行化。你可以自信地增加并行化层,而无需担心线程之间的冲突。然而,过度同步可能会增加应用程序的复杂性,降低性能。并行编程本质上比顺序变成更复杂。当问题出现时,人民更倾向于增加同步以获得更可预测的结果。

2025-10-10 10:07:05 982 1

原创 Rust内存详解

大多数应用程序,不论服务器、区块链、人工智能、游戏还是其他领域。都需要数据。因此理解内存的复杂性相当重要。应该注意的是,Rust没有正式的内存管理模型(一套定义良好的规则和机制,用于自动管理内存的分配,使用和释放从而确保内存高效、安全地使用)。但是Rust的特性(例如默认不可变性、智能指针、所有权和生命周期)形成了一种非正式的内存管理模型。

2025-10-10 09:51:22 1219

原创 Rust多线程详解

在Rust中,每个进程最初只有一条主执行路径,被称为主线程。main函数执行的就是主线程。我们可以创建额外的线程,以实现并行执行任务或操作。Rust中的线程本质上就是操作系统线程或物理线程,Rust中的线程与操作系统线程存在一一对应的关系,这与一些语言的绿色线程(M: N线程模型)不同,绿色线程将多个逻辑线程(M)调度到少数个物理线程(N)上运行。并行和并发变成是引入多线程模型的两个重要原因。你可能会觉得既然2个线程可以提升性能,那10个线程效果岂不是更好?然而事实并非如此。

2025-10-06 14:58:48 459 1

原创 Rust闭包详解

闭包是可以捕获外部环境中的变量的匿名函数。它所引用的外部变量被称为自由变量(这些变量本不属于闭包函数的作用域范围)。与普通函数类似,闭包可以执行代码逻辑、接收参数输入,并返回值。闭包可以实现Fn、FnMut、FnOnce三个不同的trait,分别对应不同的行为。需要注意的是,这里Fn和定义函数指针类型使用的fn是不同的。绝大多数情况下,编译器根据上下文自动推断闭包应该实现哪个trait.需要注意的是。

2025-10-03 15:46:47 400

原创 Rust模式匹配详解

模式在Rust中主要有两个用途模式由一系列规则和符号构成,由于描述一个值的结构。模式匹配可用于变量绑定、表达式、函数参数、返回值等场合。

2025-10-02 16:39:32 628

原创 Rust泛型详解

泛型可以看作构建函数和类型定义的模板。标准库中有很多常见类型例如Option<T>Vec<T>等都是泛型实现的。主要用于代码的特化。Rust是静态类型语言,因此泛型的类型参数(T)需要在编译期解析为具体类型,这种特性就是参数化多态性。泛型的实现还采用单态化技术,会根据实际传入的类型参数,将泛型实例化为唯一的专用类型。

2025-09-29 16:44:55 885 3

原创 Rust错误处理详解

如果Option/Result的值为None/Err(E),就会引发panicprintln!("{}",ret);

2025-09-26 20:11:18 1026

原创 Rust HashMap详解

哈希表是一种查找表,其中的条目有键(key)和值(value)组成。它是一个可变集合,可以在运行时插入和移除条目,类似于其他语言的字典和表。

2025-09-24 18:40:49 422

原创 Rust数组与向量

数组实现了IntoIterator trait,可以使用for-in迭代,for-in会自动调用数组的into_iter方法转换成迭代器。在Rust中,从数组到切片是隐式的,而从切片转换到数组不是隐式的。当我们尝试在数组中移动一个元素,这会导致数组的一部分内容不再被数组拥有,是不可预算的行为。一维数组只由列组成,二维数组是由行和列组成的,而三维数组是由行、列和深度组成的。数组类型需要手动声明,并且声明数组类型需要与原切片的长度相同。向量是动态数组,与数组不同的区别是,向量可以动态地伸长和收缩。

2025-09-24 17:09:51 957

原创 Rust循环

当我们使用for-in循环时,这个变量的所有权会被移动到循环内部,这就导致for-in循环结束后,这个变量不再可用。在嵌套循环中,for/while/loop通常只能break或continue当前的循环,然而在某些情况下,我们需要跳出到外层循环,或者跳过当前循环。需要注意的是,这个三角序列是无穷的,next函数永远不会返回None,因此for-in会无限循环,相应的,使用take方法来仅返回前6项。在迭代器中,有一个enumeratr方法,返回一个包含两个字段的元组,分别是当前项的索引和值。

2025-09-24 14:55:37 384

原创 print!/println!宏详解

控制台命令行程序适合很多场景,如记录事件日志、配置应用程序、接收用户输入、访问开发者工具等等。它是GUI的一种可替代方案。Rust提供了多种与控制台进行交互的读写操作,我们从最常用的println!和print!宏开始。

2025-09-23 14:05:45 776

原创 Rust字符串

这时String会继承str的所有方法,这种隐式转换的原理就是String类型为str实现了Deref trait,这种自动转换行为被称为Deref强制转换,但反过来,从str转换为String类型是不允许的。()的用法类似,不同的是,它返回一个格式化后的字符串,而不是直接输出。要获取字符串中字符的数量,可以首先使用chars返回字符串字符的迭代器,然后在迭代器上调用count方法来统计字符数量。你可以通过字符串切片来访问String中的字符,起始索引和结束索引来表示字节位置,切片的结果是一个str。

2025-09-22 15:45:50 890

原创 Rust简介

Rust最初被设计为系统编程语言,但随着发展,它已经成为了一门更加通用的编程语言,包括系统软件、网络服务、桌面应用程序、嵌入式等。Rust的是它区别与其他基于C的语言的关键。它通过强制单一所有权原则促进安全编码。

2025-09-22 12:21:30 963

原创 内聚和耦合基础

尽量实现松耦合。松耦合能让代码的不同部分彼此独立,减少相互影响。实现方式包括接口和依赖注入。保持高内聚。高内聚让类更专注于单一职责,使其更易于复用和测试。理想状态是低耦合 + 高内聚。这样代码会更清晰、可读、易于维护和扩展。

2025-09-17 20:01:01 1021

原创 依赖注入基础

依赖注入(Dependency Injection, DI)就是把对象创建的任务转移到代码的其他部分。也就是说,把“依赖”作为外部传入的对象来使用。这样做的好处是可以让代码实现松耦合。👉 关于松耦合的好处,可以参考耦合与内聚(Coupling and Cohesion)。目前并没有一致的观点认为 DI 是不是一种“设计模式”。这里作为入门介绍,解释会比较简化和主观。要更深入理解,你需要进一步学习控制反转(IoC)和相关的设计模式。DI 的核心目标:降低耦合度。优点:提高代码灵活性、可扩展性,简化测试。

2025-09-17 19:18:14 413

原创 不变性和可变性基础

一般来说,自定义类的对象是可变的。但是,在某些情况下我们希望它们是不可变的:不可变对象是线程安全的,更容易测试,也可能更安全。不可变对象可以在不同线程之间安全共享,而无需额外的保护措施。可变对象的状态很难追踪,因为它们随时可能被任何工作线程修改。在自定义对象的语境中,我们还可以谈到弱不可变性(weak immutability)和强不可变性(strong immutability)。弱不可变性:对象的一部分字段是不可变的,另一部分是可变的。强不可变性:对象的所有字段都是不可变的。

2025-09-17 19:00:28 561

原创 环境变量基础

环境变量是定义在普通程序之外的变量。它们由操作系统提供支持,可以被定义、编辑、保存并在更大范围内使用。顾名思义,环境变量由名称/值对组成。不同于你在代码或终端里定义的变量,环境变量的作用域可能覆盖整个操作系统。程序中的变量及其值决定了程序的运行方式。同样,环境变量也会决定计算机上运行的各个进程的行为。环境变量在不同操作系统中的实现和语法并不相同。环境变量是操作系统不可或缺的一部分。某种意义上说,它们就是操作系统的“变量”。

2025-09-17 18:54:34 298

原创 Rust位置表达式和值表达式

Rust中的表达式分为位置表达式(可作左值)和值表达式(只能作右值)。位置表达式包括本地变量、静态变量、解引用、数组索引、结构体字段及其组合,它们都表示可修改的内存位置。值表达式出现在位置上下文会报错,而位置表达式在值上下文中会转移所有权。所有权规则确保内存安全,如String赋值会转移所有权,而&str则可复制。这种机制是Rust内存安全的核心特性。

2025-09-08 22:35:00 320

原创 Git入门

本文介绍了Git的基本概念与安装配置方法。Git是一个分布式版本控制系统,用于跟踪代码修改、协作开发与管理项目历史。它支持本地和远程仓库,可离线工作或多人协作。文章详细说明了Windows、Linux系统的安装步骤,并讲解了如何配置用户名、邮箱、默认编辑器等个性化设置,以及常用命令别名等优化技巧。这些基础配置能帮助开发者更高效地使用Git进行版本控制。

2025-08-20 16:35:44 843

原创 Kotlin集合概述

Kotlin集合分为可变和不可变两类,可变集合通过MutableCollection、MutableMap等接口实现,支持增删改操作;不可变集合则只能读取。Kotlin主要复用Java的集合类(如HashSet、ArrayList等),通过类型别名扩展功能,并额外提供5个可变集合实现类。不可变集合通过特定函数创建,其实现类未直接暴露。这种设计既保持了与Java集合的兼容性,又通过分类增强了安全性。

2025-08-17 11:23:55 471

原创 Set集合

Kotlin中的Set集合是Collection的子类型,特点是元素不可重复。Kotlin并未独立实现Set类,而是复用Java集合框架,建议使用Kotlin工具函数创建Set集合。主要创建函数包括:setOf()(不可变集合)、mutableSetOf()(可变集合)、hashSetOf()(无序HashSet)、linkedSetOf()(保持插入顺序)和sortedSetOf()(排序TreeSet)。Kotlin为Set扩展了丰富的方法,如map、filter、sum等函数式操作,以及union、i

2025-08-17 11:14:24 1105

原创 Kotlin反射详解

本文介绍了Kotlin反射机制及其应用。反射允许运行时检查和操作类结构,在动态编程中尤为重要。Kotlin通过kotlin.reflect包扩展了Java反射功能,支持数据类、扩展函数等特性。文章展示了如何添加反射依赖(Gradle/Maven),并通过实例演示了属性映射、类实例化、方法调用等基本操作,以及泛型类型信息获取等高级用法。虽然反射在框架开发中具有优势,但也存在性能开销和安全风险。建议合理使用反射,避免在性能敏感场景滥用。

2025-08-09 20:17:05 1186 1

原创 哈希与安全

信息安全在任何应用中都至关重要,哈希函数与 Bcrypt 是维护数据完整性和机密性的核心工具。哈希函数适用于数据完整性验证与密码安全存储。Bcrypt 通过自适应运算和盐值机制,有效抵御暴力破解与彩虹表攻击。安全并非一次性成果,而是持续改进和适应新威胁的过程。

2025-08-09 19:14:36 1321

原创 Kotlin反射

元编程是程序操作代码本身的能力,反射是 Kotlin 中最重要的运行时元编程工具。Java 反射和 Kotlin 反射各有适用场景:Java 反射:兼容 Java 生态,底层框架、跨语言调用Kotlin 反射:更符合 Kotlin 语法和特性反射强大但要谨慎使用,尤其在性能和安全敏感场景。大型框架(如 Spring、Hibernate、Jackson)大量依赖反射,但通常会配合缓存、字节码增强、注解处理器等技术优化性能。

2025-08-09 11:42:13 1094

原创 模式匹配详解

模式匹配与正则匹配⾮常相似,只是模式匹配中匹配的不仅有正则表达式,还可以有其他表达式。这⾥的“ 表达式” 就是我们将要介绍的模式。Num类表⽰某个整数的值;Operate类则是⼀个树形结构,它被⽤来表⽰⼀些复杂的表达式,其中opName 属性表⽰常见的操作符,⽐如。进行整数表达式加法运算时,往往会遇到许多可以简化的表达式,比如1+0 => 11*0 => 0,现在我们需要实现一个简单的需求: 将0+x或者x+0简化为x,其他情况返回表达式本身。伪代码如下模仿Java风格,我们很容易写出这样的代码。

2025-08-09 00:44:31 1437

原创 Kotlin反射

反射是 Kotlin 中的强大的特性之一:它使你能够在运行时修改、检查或创建对象、函数和方法,从而在构建和维护动态应用程序时提供了极大的灵活性。在 Kotlin 中,我们可以通过多种方式实现元编程,例如注解(Annotations)或反射(Reflection)。反射的意思是:编写的程序可以在运行时观察自己,甚至修改自身。在元编程中,程序的输入是代码,并产生新的代码或修改正在运行的代码行为。在 Kotlin 中可以使用 Java 的反射 API 或 Kotlin 的反射库进行反射,但在本节中,我们只关注。

2025-08-08 17:41:59 1036

原创 Kotlin属性委托

本文介绍了 Kotlin 中强大的属性委托机制。我们学习了:如何使用getValue()和setValue()实现自定义委托;如何使用匿名对象来创建委托;如何将属性委托给另一个属性;以及推荐的使用最佳实践。属性委托不仅使代码更加清晰和复用性更强,还可以增强系统的扩展能力,是 Kotlin 提供的一项非常实用的语言特性。

2025-08-05 08:53:06 1151

原创 笛卡尔坐标

笛卡尔坐标系是描述平面上点的标准方式,因此理解它的工作原理非常重要。每个点都有唯一的一对坐标,所以判断两个点是否相同非常简单。笛卡尔坐标系非常适合用来描述直线和直角,但不太适合描述圆或螺旋这样的图形。

2025-08-04 23:32:39 850

原创 数学 理论

这节课我们学习了数学的基础知识。数学符号:字母、符号、数字和记号,用于表示数学运算和元素。数学公式:由数学符号构成的表达式,用于更快速、更规范地表达数学关系。数学陈述:给出某种信息的句子,其真假可以判断。

2025-08-04 23:12:45 583

原创 动态数组基础

动态数组就像一个常规数组,但存储的元素数量可以改变。如果添加操作导致没有足够的空间存储元素,就会分配一个新的更大的数组,并将旧数组的每个元素复制到新数组中。使用更大的因子,我们会有更少的分配和复制操作,但浪费内存的可能性更高。还有一些更独特的情况,例如Go语言的动态数组(“切片”),在元素数量达到1024之前会将大小翻倍,之后比例变为5/4。使用更大的增长因子,我们可以在需要扩展数组之前进行更多的插入操作,从而降低时间复杂度。,因为每次插入时,我们必须将目标索引处的元素以及之后的所有元素向右移动一个位置。

2025-07-30 11:10:30 833

原创 定长数组基础

以下是本节的要点总结:数组是一种在编程中广泛使用的数据结构。定长数组用于存储相同类型的数据集合,长度在创建后不能更改。最常用的操作是通过索引访问元素,这种操作效率高(O(1))。插入或删除元素会破坏数组的固定长度,不适用于定长数组。使用数组可以使程序结构更清晰、存储更节省。否则你需要为每一个值声明一个变量,程序会变得复杂且不易维护。若要了解更多数组处理方法,请查阅你所用编程语言的标准库文档。当你已知数据量,且这些数据属于同一类型时,定长数组是一个非常合适的选择。

2025-07-30 08:52:31 860

原创 负数模除原理

下面我们来看看这些不同的定义,并尝试回答我们最开始提出的问题:-42 ÷ 10(以及 42 ÷ -10)的结果会是什么?

2025-07-28 17:26:17 848

原创 Kotlin的datetime库

Instant表示时间线上某个具体的时刻,常用于比较两个时间点或存储时间戳。用于表示时区信息。:获取系统默认时区:UTC 时区(ISO 8601 中的 “Z”)println(tz2) // 输出 Z其他时区可以用方法传入时区字符串,如偏移量或区域名,可从tz数据库val tz3 = TimeZone.of("Europe/Paris") // 巴黎时区val tz4 = TimeZone.of("UTC+2") // UTC+2 时区无效参数会抛出。本文介绍了库中的InstantTimeZone。

2025-07-28 14:32:34 882

价值百万的小米logo(mix2s开机动画)

价值百万的小米logo(mix2s开机动画)

2025-02-26

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除