当前位置: 首页 > news >正文

Rust 数据类型详解

一、标量类型(Scalar Types)

标量类型代表一个单独的值。Rust 中有四大基本标量类型:整数(integer)、浮点数(floating-point number)、布尔(boolean)和字符(character)。这几种类型在大多数编程语言中都很常见。

1. 整数类型(Integer Types)

整数(integer)是没有小数部分的数字。在之前的猜数字游戏教程里,我们用到了 u32。这个类型声明表示该值是一个无符号(unsigned)32 位整数(如果是有符号类型,会以 i 开头,例如 i32)。

下表展示了 Rust 中所有内置的整数类型,每个类型要么是有符号(signed),要么是无符号(unsigned),并且有明确的位数大小。

长度有符号无符号
8-biti8u8
16-biti16u16
32-biti32u32
64-biti64u64
128-biti128u128
archisizeusize
  • 有符号(signed)表示数值可能为正也可能为负,所以存储时需要符号位;
  • 无符号(unsigned)则只表示非负数(0 或正数),不需要符号位。

对于有符号整数,如果类型是 i8,它可以存储从 -128 到 127 的数值;若是 i16,则范围会相应扩大,以此类推。无符号类型则从 0 起算。例如 u8 能表示 0 到 255。

isizeusize 根据系统架构的不同而变化:在 64 位架构上是 64 位,在 32 位架构上是 32 位。这些类型常用于根据系统架构进行索引或内存大小计算等场景。

1.1 整数字面量

在 Rust 中可以使用多种形式来表达整数字面量(literal),如下表所示:

数字字面量形式示例
十进制98_222
十六进制0xff
八进制0o77
二进制0b1111_0000
字节(仅限 u8b'A'

注意:

  • 可以在数字中使用下划线 _ 作为分隔符来提高可读性,例如 1_0001000 等价。
  • 如果需要指定类型,可以在数字后面加上类型后缀,比如 57u8

通常如果不确定该用什么整数类型,Rust 默认使用 i32。若需要根据系统架构进行索引等场景时,才考虑使用 isizeusize

1.2 整数溢出(Integer Overflow)

假设我们有一个 u8 类型的变量,它能表示的数值范围是 [0, 255]。如果尝试将其赋值为 256,就会发生整数溢出integer overflow),导致以下两种行为之一:

  1. 调试(debug)模式编译:Rust 会执行溢出检查,一旦发现溢出,就会在运行时 panic(程序崩溃并退出)。
  2. 发布(release)模式编译:Rust 不做溢出检查,而是进行二补码环绕two’s complement wrapping)。换言之,超出最大可表示值时会“环绕”回最小值。例如,对于 u8 类型,256 会变成 0,257 会变成 1,等等。不会出现 panic,但是结果往往与期望不符。

在实际开发中,不应依赖整数溢出的环绕行为,这被认为是错误的做法。若需要显式处理溢出,可以使用标准库里为整数提供的以下方法族:

  • wrapping_*:如 wrapping_add,始终进行环绕运算;
  • checked_*:如 checked_add,若溢出则返回 None
  • overflowing_*:如 overflowing_add,返回一个元组 (结果, bool),其中 bool 指示是否发生溢出;
  • saturating_*:如 saturating_add,在溢出时结果会自动“饱和”到对应类型的最小或最大值。

2. 浮点数类型(Floating-Point Types)

Rust 提供了两种原生的浮点数类型:f32(32 位)和 f64(64 位)。默认使用 f64,因为在现代 CPU 上,f64f32 速度几乎相当,但精度更高。所有浮点类型都是有符号数。

fn main() {let x = 2.0;    // f64let y: f32 = 3.0;  // f32println!("x = {}, y = {}", x, y);
}

Rust 的浮点数遵循 IEEE-754 标准。

3. 数值运算(Numeric Operations)

Rust 支持常见的数值运算:加法、减法、乘法、除法和取余。需要注意的是,整数除法会向零方向取整(截断小数部分)。示例:

fn main() {// 加法let sum = 5 + 10;// 减法let difference = 95.5 - 4.3;// 乘法let product = 4 * 30;// 除法let quotient = 56.7 / 32.2;// 取余let remainder = 43 % 5;println!("sum = {}", sum);println!("difference = {}", difference);println!("product = {}", product);println!("quotient = {}", quotient);println!("remainder = {}", remainder);
}

如果需要查看 Rust 提供的所有运算符,可以参考 附录 B。

4. 布尔类型(Boolean Type)

布尔类型(bool)只有两个可能的值:truefalse。它所占的大小是 1 个字节。例如:

fn main() {let t = true;let f: bool = false;println!("t = {}, f = {}", t, f);
}

布尔常常用于条件判断(如 if 表达式),后面会在“控制流”一节详述。

5. 字符类型(Character Type)

Rust 的 char 类型是最基础的字母类型,用单引号包裹,支持 Unicode Scalar Value。这意味着它可以表示除 ASCII 之外更多的字符,比如带重音的拉丁字符、中文、日文、韩文、emoji、零宽空格等。例如:

fn main() {let c = 'z';let z = 'ℤ';let heart_eyed_cat = '😻';println!("{}, {}, {}", c, z, heart_eyed_cat);
}

Rust 的 char 类型占 4 个字节,对应 Unicode Scalar Value 范围:U+0000 ~ U+D7FFU+E000 ~ U+10FFFF。需要注意的是,Unicode 的“字符”概念可能与人们直觉中的“字符”不完全一致。详情可参考第 8 章关于字符串的讨论。

二、复合类型(Compound Types)

复合类型可以将多个值组合成一个类型。Rust 提供了两种原生的复合类型:元组(tuple)和数组(array)。

1. 元组类型(Tuple Type)

元组(tuple)可以将多个类型各异的值组合到一个复合类型中,长度固定,不可增长或缩短。使用小括号 () 包含并用逗号分隔不同的值。例如:

fn main() {let tup: (i32, f64, u8) = (500, 6.4, 1);println!("tup = {:?}", tup);
}
1.1 解构(Destructuring)元组

要获取元组中的单独值,可以使用模式匹配(pattern matching)进行解构:

fn main() {let tup = (500, 6.4, 1);let (x, y, z) = tup;println!("y = {}", y);
}

执行后,y 的值就是 6.4。这里 tup 被“拆解”成了 x, y, z 三个变量的过程,称为解构

1.2 使用索引访问元组

也可以直接用点号加索引来访问元组的指定元素:

fn main() {let x: (i32, f64, u8) = (500, 6.4, 1);let five_hundred = x.0;let six_point_four = x.1;let one = x.2;println!("{}, {}, {}", five_hundred, six_point_four, one);
}

需要注意,索引从 0 开始。

1.3 单元类型(Unit Type)

如果元组不包含任何元素,则被称为单元元组(unit)。它写作 (),表示一种空值或空的返回类型。若一个表达式没有返回任何其他值,默认会返回单元元组。

2. 数组类型(Array Type)

数组(array)也是一种把多个值组合在一起的方式,但它与元组有两个主要区别:

  1. 数组中所有元素类型相同
  2. 数组长度固定,一旦声明,长度就无法改变。

例如:

fn main() {let a = [1, 2, 3, 4, 5];println!("{:?}", a);
}

数组通常存储在上(stack)而不是堆上(heap),这在 第 4 章 会详细解释。若需要一个可伸缩的序列,则使用标准库提供的 向量vectorVec<T>)。如果你需要一个长度固定的序列,数组就非常合适。比如月份名称:

let months = ["January", "February", "March", "April", "May", "June","July", "August", "September", "October", "November", "December"
];
2.1 数组的类型注解

声明数组类型时,需要在方括号里写元素类型、分号、元素个数:

let a: [i32; 5] = [1, 2, 3, 4, 5];

这里 i32 是每个元素的类型,5 表示数组长度。

2.2 初始化为相同元素

如果想让数组的所有元素都相同,可以使用如下语法:

let a = [3; 5];
// 等价于 let a = [3, 3, 3, 3, 3];
2.3 访问数组元素

可以使用索引来访问数组元素:

fn main() {let a = [1, 2, 3, 4, 5];let first = a[0];let second = a[1];println!("first = {}, second = {}", first, second);
}
2.4 越界访问与运行时错误

如果索引超出了数组的长度,Rust 会在运行时检查到错误并 panic:

fn main() {let a = [1, 2, 3, 4, 5];println!("请输入一个数组索引。");let mut index = String::new();std::io::stdin().read_line(&mut index).expect("读取失败");let index: usize = index.trim().parse().expect("输入的索引不是数字");let element = a[index];println!("你选择的元素是:{}", element);
}

如果你输入了超出 [0..4] 范围的索引,比如 10,就会引发 panic,显示类似:

thread 'main' panicked at 'index out of bounds: the len is 5 but the index is 10', src/main.rs:19:19

程序因此退出并不会执行后续的 println!。这是 Rust 保证内存安全的体现:许多低级语言在越界索引时可能会访问非法内存地址,引发不可预料的后果,而 Rust 直接在运行时检测并退出以保证安全。

小结

在本篇文章中,我们介绍了 Rust 最常用的两种数据类型子集:标量类型复合类型。标量类型包括整数、浮点数、布尔和字符,它们各自有不同的表示和范围;复合类型包括元组和数组,可以用于将多个值组合到一个类型中,并且在长度是否可变和类型一致性方面有所区别。

  • 标量类型

    • 整数:如 i32, u32, i8, u8 等,不同字长和有符号/无符号选择;
    • 浮点数f32f64,默认使用 f64
    • 布尔bool,仅有 truefalse
    • 字符char,占 4 字节,可表示 Unicode Scalar Value。
  • 复合类型

    • 元组:可含多种类型,长度固定;可用解构或索引方式访问;
    • 数组:同类型元素的集合,长度固定,存储于栈上。

对于新手而言,遇到无法自动推断类型的情形时,需要加上类型注解,尤其是在使用 parse 或其他需要指明具体数值类型的场景下。随着实践的深入,Rust 提供的多种安全检查机制(如整数溢出检查、数组越界检查等)会给予你更多信心和安全感,同时也需要你熟悉这些机制以写出高效且安全的代码。

在后续章节中,我们将会不断深入 Rust 的特性,包括所有权、引用与切片、集合类型(向量、字符串、哈希映射)以及错误处理等,希望你能继续保持对 Rust 的探索与学习。

参考与致谢

  • The Rust Programming Language - By Steve Klabnik and Carol Nichols, CC BY 4.0
  • 本文部分内容基于其翻译和改写,如需了解更多细节,请阅读官方文档。

相关文章:

Rust 数据类型详解

一、标量类型&#xff08;Scalar Types&#xff09; 标量类型代表一个单独的值。Rust 中有四大基本标量类型&#xff1a;整数&#xff08;integer&#xff09;、浮点数&#xff08;floating-point number&#xff09;、布尔&#xff08;boolean&#xff09;和字符&#xff08;…...

(十四)WebGL纹理坐标初识

纹理坐标是 WebGL 中将 2D 图像&#xff08;纹理&#xff09;应用到 3D 物体表面的重要概念。在 WebGL 中&#xff0c;纹理坐标通常使用一个二维坐标系&#xff0c;称为 uv 坐标&#xff0c;它们决定了纹理图像如何映射到几何体上。理解纹理坐标的核心就是明白它们如何将二维纹…...

青少年CTF练习平台 EasyMD5解题思路

题目 EasyMD5 PHP弱类型/弱等于的判断 翻译 上传之后网页提示&#xff1a;Not a PDF! angry!!! get out from my page 修改文件后缀为pdf 再次上传&#xff0c;答案出来了 s878926199a s155964671a 成功获取flag...

二叉搜索树(TreeMapTreeSet)

文章目录 1.概念2.二叉搜索树的底层代码实现(1)首先构建二叉树(2)实现插入功能&#xff1b;(3)实现查找(4)删除&#xff08;重点&#xff09; 3.TreeMap 1.概念 TreeMap&TreeSet都是有序的集合都是基于二叉搜索树来实现的 二叉搜索树&#xff1a;是一种特殊的二叉树 若左子…...

鸿蒙动态路由实现方案

背景 随着CSDN 鸿蒙APP 业务功能的增加&#xff0c;以及为了与iOS、Android 端统一页面跳转路由&#xff0c;以及动态下发路由链接&#xff0c;路由重定向等功能。鸿蒙动态路由方案的实现迫在眉睫。 实现方案 鸿蒙版本动态路由的实现原理&#xff0c;类似于 iOS与Android的实…...

matlab实现一个雷达信号处理的程序,涉及到对原始图像的模拟、加权、加噪以及通过迭代算法对图像进行恢复和优化处理

clc clear close all load scene3.mat %加载原始图像,自己设计 设计为一个300*400的矩阵 300是距离向长度,400是方位向长度 Map_ori = scene3; [M,N_K] = size(Map_ori);figure imagesc(scene3) v = 100; %机载速度,单位m/s bandwidth = 30*1e6; …...

设置 Git 默认推送不需要输入账号和密码【Ubuntu、SSH】

如何设置 Git 默认推送不需要输入账号和密码 在使用 Git 管理代码时&#xff0c;许多开发者会遇到每次推送&#xff08;push&#xff09;或拉取&#xff08;fetch&#xff09;代码时都需要输入 GitHub 或 GitLab 等远程仓库的账号和密码的情况。虽然设置了用户名和电子邮件信息…...

【深度学习】Pytorch:导入导出模型参数

PyTorch 是深度学习领域中广泛使用的框架&#xff0c;熟练掌握其模型参数的管理对于模型训练、推理以及部署非常重要。本文将全面讲解 PyTorch 中关于模型参数的操作&#xff0c;包括如何导出、导入以及如何下载模型参数。 什么是模型参数 模型参数是指深度学习模型中需要通过…...

ABP - 缓存模块(1)

ABP - 缓存模块&#xff08;1&#xff09; 1. 与 .NET Core 缓存的关系和差异2. Abp 缓存的使用2.1 常规使用2.2 非字符串类型的 Key2.3 批量操作 3. 额外功能 1. 与 .NET Core 缓存的关系和差异 ABP 框架中的缓存系统核心包是 Volo.Abp.Caching &#xff0c;而对于分布式缓存…...

【unity进阶篇】unity如何实现跨平台及unity最优最小包体打包方式(.NET、Mono和IL2CPP知识介绍)

考虑到每个人基础可能不一样&#xff0c;且并不是所有人都有同时做2D、3D开发的需求&#xff0c;所以我把 【零基础入门unity游戏开发】 分为成了C#篇、unity通用篇、unity3D篇、unity2D篇。 【C#篇】&#xff1a;主要讲解C#的基础语法&#xff0c;包括变量、数据类型、运算符、…...

5-1 创建和打包AXI Interface IP

创建和打包AXI Interface IP的前流程和后流程 step 1 &#xff1a; 选择类型 1&#xff1a; 将当前的工程打包成IP 2&#xff1a; 将当前的BD工程打包成IP 3&#xff1a; 将指定的源码打包成IP 4&#xff1a; 创建一个新的AXI 接口IP 其中3和4是比较常用的&#xff0c;本次…...

【C++】如何从源代码编译红色警戒2地图编辑器

【C】如何从源代码编译红色警戒2地图编辑器 操作视频视频中的代码不需要下载三方库&#xff0c;已经包含三方库。 一、运行效果&#xff1a;二、源代码来源及编程语言&#xff1a;三、环境搭建&#xff1a;安装红警2安装VS2022下载代码&#xff0c;源代码其实不太多&#xff0c…...

HRNet,Deep High-Resolution Representation Learning for Visual Recognition解读

论文、代码和ppt地址&#xff1a;HRNet。代码地址: hrnet 本文通过paper解读和代码实例以及onnx模型的分析&#xff0c;来说明hrnet模型。 摘要——高分辨率表征对于诸如人体姿态估计、语义分割和目标检测等对位置敏感的视觉问题至关重要。现有的最先进框架首先通过一个子网&…...

Rust Actix Web 项目实战教程 mysql redis swagger:构建用户管理系统

Rust Actix Web 项目实战教程&#xff1a;构建用户管理系统 项目概述 本教程将指导你使用 Rust 和 Actix Web 构建一个完整的用户管理系统&#xff0c;包括数据库交互、Redis 缓存和 Swagger UI 文档。 技术栈 Rust 编程语言Actix Web 框架SQLx (MySQL 数据库)Redis 缓存Uto…...

# 爬楼梯问题:常见数列的解法总结

爬楼梯问题&#xff1a;常见数列的解法总结 在编程中&#xff0c;爬楼梯问题&#xff08;Climbing Stairs Problem&#xff09;是一个经典的动态规划问题&#xff0c;常常作为入门学习动态规划和递推的重要例题。这个问题看似简单&#xff0c;但背后包含了多种解决方式&#x…...

速通Docker === 常用命令

目录 Docker命令 镜像操作 容器操作 基础操作 启动参数 容器内部操作 打包成指定文件 发布镜像 总结 镜像操作 容器操作 启动容器参数 容器内部操作 打包镜像 启动指定镜像的容器 发布镜像 Docker命令 启动一个nginx,并将它的首页改为自己的页面&#xff0c;发布…...

AWS S3 跨账户访问 Cross Account Access

进入S3对应的存储桶&#xff0c;上面选项选权限&#xff0c;存储桶策略 -- 编辑&#xff0c;输入对应的policy。 完全控制&#xff0c;包含上传删除权限&#xff0c;policy如下&#xff1a; {"Version": "2012-10-17","Statement": [{"Si…...

C#中常见的锁以及用法--18

目录 一.C#中存在的锁 二.锁的作用 三.锁的概念和定义 关于锁的完整代码示例 代码逐层剖析: 全局变量与同步变量 Lock(锁)关键字示例 Monitor(监视器锁)示例 Mutex(互斥量)示例(支持跨进程同步) SemaphoreSlim(信号量)示例 ReadWriterLockSlim(读写锁)示例 SpinLock…...

【数据分享】1929-2024年全球站点的逐年平均气温数据(Shp\Excel\无需转发)

气象数据是在各项研究中都经常使用的数据&#xff0c;气象指标包括气温、风速、降水、湿度等指标&#xff0c;其中又以气温指标最为常用&#xff01;说到气温数据&#xff0c;最详细的气温数据是具体到气象监测站点的气温数据&#xff01;本次我们为大家带来的就是具体到气象监…...

Docker部署MySQL 5.7:持久化数据的实战技巧

在生产环境中使用Docker启动MySQL 5.7时&#xff0c;需要考虑数据持久化、配置文件管理、安全性等多个方面。以下是一个详细的步骤指南。 1. 准备工作 &#xff08;1&#xff09;创建挂载目录 在宿主机上创建用于挂载的目录&#xff0c;以便持久化数据和配置文件。 sudo mkdi…...

二叉树和堆

树概念及结构&#xff08;了解&#xff09; 树的概念&#xff08;看看就行&#xff09; 树是一种 非线性 的数据结构&#xff0c;它是由 n &#xff08; n>0 &#xff09;个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树&#xff0c;也就是…...

Zookeeper(15)Zookeeper的ZooKeeper API包含哪些主要操作?

Zookeeper 的 ZooKeeper API 提供了一系列操作来管理 Zookeeper 的数据节点&#xff08;znodes&#xff09;。这些操作主要包括创建节点、删除节点、读取节点数据、设置节点数据、列出子节点、检查节点是否存在&#xff0c;以及注册 Watcher 等。以下是这些操作的详细介绍和代码…...

深入浅出:Go语言os包中的API使用指南

深入浅出:Go语言os包中的API使用指南 引言 Go语言以其简洁、高效和强大的生态系统著称,是现代编程中不可或缺的一部分。其中,os包作为Go标准库的一部分,提供了丰富的API来与操作系统进行交互。本文将深入探讨os包中的核心功能,并通过实际案例帮助读者更好地理解和应用这些…...

【云岚到家】-day02-客户管理-认证授权

第二章 客户管理 1.认证模块 1.1 需求分析 1.基础概念 一般情况有用户交互的项目都有认证授权功能&#xff0c;首先我们要搞清楚两个概念&#xff1a;认证和授权 认证: 就是校验用户的身份是否合法&#xff0c;常见的认证方式有账号密码登录、手机验证码登录等 授权:则是该用…...

vben5 admin ant design vue如何使用时间范围组件RangePicker

本文参考&#xff1a;https://pusdn-dev.feishu.cn/wiki/VF4hwBAUliTE6TkUPKrcBNcZn9f?fromfrom_copylink 由PUSDN整理发行&#xff0c;收录时请保留PUSDN。 前端组件专题 年月日时间范围表单回显RangePicker 推荐使用多个字段存储&#xff0c;不推荐用英文逗号拼接时间&am…...

安全策略配置实验

安全策略配置实验 1.拓扑 2.需求 2、办公区PC在工作日时间(周一至周五&#xff0c;早8到晚6)可以正常访问OA srver&#xff0c;其他时间不允许 3、办公区PC可以在任意时刻访问web server 4、生产区PC可以在任意时刻访问OA Server&#xff0c;但是不能访问Web server 5、特…...

Win10安装WebODM和操作全流程

效果 以下是在 Windows 10 上安装和部署 WebODM 的详细教程: 一、安装 Docker Desktop for Windows 1、访问 Docker 官方网站:https://www.docker.com/products/docker-desktop 。 2、下载 Docker Desktop for Windows 的安装程序。 3、运行安装程序: 双击下载的安装程序,…...

wireshark抓路由器上的包 抓包路由器数据

文字目录 抓包流程概述设置抓包配置选项 设置信道设置无线数据包加密信息设置MAC地址过滤器 抓取联网过程 抓包流程概述 使用Omnipeek软件分析网络数据包的流程大概可以分为以下几个步骤&#xff1a; 扫描路由器信息&#xff0c;确定抓包信道&#xff1b;设置连接路由器的…...

第8章:Python TDD处理货币类代码重复问题

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

C#,入门教程(01)—— Visual Studio 2022 免费安装的详细图文与动画教程

通过本课程的学习&#xff0c;你可以掌握C#编程的重点&#xff0c;享受编程的乐趣。 在本课程之前&#xff0c;你无需具备任何C#的基础知识&#xff0c;只要能操作电脑即可。 不过&#xff0c;希望你的数学不是体育老师教的。好的程序是数理化的实现与模拟。没有较好的数学基础…...

Agent Laboratory: Using LLM Agents as Research Assistants 论文简介

加速机器学习研究的智能实验室——Agent Laboratory 1. 引言 随着人工智能技术的飞速发展&#xff0c;机器学习领域正以前所未有的速度推进科学发现和技术创新。然而&#xff0c;传统的科学研究模式往往受到时间、资源和专业知识限制&#xff0c;阻碍了研究者们探索新想法的能…...

cuda + cudnn安装

1.安装CUDA Toolkit 在设备管理器&#xff08;此电脑–右键–属性&#xff09;的显示适配器中可以查看自己的显卡型号&#xff0c;去下载对应的CUDA Toolkit 。或者输入以下命令查看Driver Version &#xff0c;cuda Version&#xff1a;12.2代表12.2版本以下兼容可以进行安装 …...

Next.js 实战 (八):使用 Lodash 打包构建产生的“坑”?

前言 最近一直在折腾 Nextjs15 &#xff0c;也在断断续续地写《Next.js15 实战系列》的文章&#xff0c;后来总感觉文章如果没有线上效果预览差点意思&#xff0c;所以就想着先把目前做的项目先部署上线&#xff0c;后续再慢慢添加新功能。 因为之前没有部署过 Nextjs15 工程…...

owasp SQL 注入-03 (原理)

1: 先看一下注入界面: 点submit 后&#xff0c;可以看到有语法报错&#xff0c;说明已经起作用了: 报如下的错误: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near at line 1 2:…...

wireshark工具简介

目录 1 wireshark介绍 2 wireshark抓包流程 2.1 选择网卡 2.2 停止抓包 2.3 保存数据 3 wireshark过滤器设置 3.1 显示过滤器的设置 3.2 抓包过滤器 4 wireshark的封包列表与封包详情 4.1 封包列表 4.2 封包详情 参考文献 1 wireshark介绍 wireshark是非常流行的网络…...

队列的基本用法

以下是关于 C 语言中队列的详细知识&#xff0c;包括队列的生成、相关函数使用以及其他重要概念&#xff1a; 一、队列的概念 队列是一种线性数据结构&#xff0c;它遵循先进先出&#xff08;First In First Out&#xff0c;FIFO&#xff09;的原则&#xff0c;就像日常生活中…...

OpenHarmony-7.IDL工具

IDL 工具 1.openharmony IDL工具 在OpenHarmony中&#xff0c;当应用/系统服务的客户端和服务端进行IPC&#xff08;Inter-Process Communication&#xff09;跨线程通信时&#xff0c;需要定义双方都认可的接口&#xff0c;以保障双方可以成功通信&#xff0c;OpenHarmony ID…...

封装Redis工具类

基于StringRedisTemplate封装一个缓存工具类,满足以下需求: 方法1:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间 方法2:将任意Java对象序列化为json并存储在string类型的key中,并且可以设置TTL过期时间,用于处理缓存击穿问题 方法3:根据指定的…...

将n变为一个可以被表示为2^{a}+2^{b}的正整数m

给出一个正整数n&#xff0c;需要将n变为一个可以被表示为的正整数m&#xff0c;其中a和b都是非负整数且a!b&#xff0c;你可以进行两种操作&#xff1a; 1.令n加1 2.令n减1 请你求出最少需要多少次操作才能将n变成满足条件的m。 输入格式 输入一个整数&#xff0c;代表n。…...

第2章:Python TDD构建Dollar类基础

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统

搭建一个基于Spring Boot的校园台球厅人员与设备管理系统可以涵盖多个功能模块&#xff0c;例如用户管理、设备管理、预约管理、计费管理等。以下是一个简化的步骤指南&#xff0c;帮助你快速搭建一个基础的系统。 — 1. 项目初始化 使用 Spring Initializr 生成一个Spring …...

JavaScript系列(33)--微前端架构详解

JavaScript微前端架构详解 &#x1f3d7;️ 今天&#xff0c;让我们深入了解JavaScript的微前端架构&#xff0c;这是一种用于构建和管理大型前端应用的现代架构模式。 微前端基础概念 &#x1f31f; &#x1f4a1; 小知识&#xff1a;微前端是一种将前端应用分解成更小、更易…...

第6章:Python TDD实例变量私有化探索

写在前面 这本书是我们老板推荐过的&#xff0c;我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后&#xff0c;我突然思考&#xff0c;对于测试开发工程师来说&#xff0c;什么才更有价值呢&#xff1f;如何让 AI 工具更好地辅助自己写代码&#xff0c;或许…...

Ubuntu 24.04 LTS 服务器折腾集

目录 Ubuntu 更改软件源Ubuntu 系统语言英文改中文windows 远程链接 Ubuntu 图形界面Windows 通过 openssh 连接 UbuntuUbuntu linux 文件权限Ubuntu 空闲硬盘挂载到 文件管理器的 other locationsUbuntu 开启 SMB 服务&#xff0c;并通过 windows 访问Ubuntu安装Tailscale&am…...

物联网在烟草行业的应用

物联网技术在烟草行业的应用 物联网技术在烟草行业的应用主要体现在以下几个方面&#xff1a; 智能制造 &#xff1a;物联网技术可以实现对生产过程中的关键参数进行实时监测&#xff0c;确保产品的质量稳定可靠。同时&#xff0c;通过对设备的远程维护和故障诊断&#xff0c;…...

2024年度总结:从后端Java到全栈成长的蜕变

目录 前言1. 用数据与实践书写成长篇章2. 技术与生活的双重蜕变3. 技术的进阶与生活的绽放 前言 今年是我入行的第十年&#xff0c;也是记录在CSDN平台上的第五年。这五年来&#xff0c;我始终坚持记录成长的点滴&#xff0c;将个人事业与博客创作紧密相连。一路走来&#xff0…...

详解构造函数和析构函数

⼀个类&#xff0c;我们不写的情况下编译器会默认⽣成以下6个默认成员函数。 下面我们详细介绍的是构造函数和析构函数&#xff0c;它们的主要作用分别是初始化工作和清理工作。 构造函数 1、构造函数的概念 构造函数虽名里带着“构造”但是其实际上并不是说开辟空间创建对…...

npm操作大全:从入门到精通

引言 在现代前端开发中&#xff0c;npm&#xff08;Node Package Manager&#xff09;是不可或缺的工具。无论是安装依赖、管理项目&#xff0c;还是发布自己的包&#xff0c;npm都扮演着重要的角色。本文将带你从npm的基础操作开始&#xff0c;逐步深入到高级用法&#xff0c…...

ChatGPT 写作系列

ChatGPT 辅助写作 | 专栏 1 写作核心​ 先讲一下 ChatGPT 写作的核心。核心就是需要有文章大纲&#xff0c;而且文章大纲要足够细致。​ 具体怎么做呢&#xff1f;​ 提前准备多级标题大纲&#xff0c;刚开始有两个级别的标题就行&#xff0c;等用熟练了再细化。分一级标题&…...

kubernetes 集群搭建(kubeadm方式)

随着容器技术的日益普及&#xff0c;Kubernetes 作为最受欢迎的容器编排平台之一&#xff0c;已经成为现代云原生应用部署不可或缺的一部分。对于想要快速构建和管理 Kubernetes 集群的人来说&#xff0c;kubeadm 提供了一种简单而强大的工具。本文将详细介绍如何使用 kubeadm …...