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

Rust生命周期、文件与IO

文章目录

    • Rust生命周期
      • 生命周期注释
      • 结构体如何使用字符串
      • 静态生命周期
    • Rust文件与IO
      • 接收命令行参数
      • 命令行输入
      • 文件读取
      • 文件写入

Rust生命周期

终于讲到Rust最重要的机制之一了,生命周期机制

我们先复习一下垂悬引用

{let r;{let x = 5;r = &x;}println!("r: {}", r);
}

这一段代码是编译失败的,原因如下

我们可以看到有两个作用域

rust-lifetime1

a和b,但是其实生命周期也是类似的概念,r的生命周期中a的范围里,x的生命周期中b的范围内

r保存的x的引用,当x销毁之后,r的引用也就失效了,因此也就产生了垂悬引用

这里有一个案例

fn longer(s1: &str, s2: &str) -> &str {if s2.len() > s1.len() {s2} else {s1}
}

接收两个字符串引用,返回两个字符串引用中较长的一个

这段代码是不能通过编译的,因为返回值返回的引用可能会过期,例如这样调用

fn main() {let r;{let s1 = "rust";let s2 = "ecmascript";r = longer(s1, s2);}println!("{} is longer", r);
}

r最后接收的是s2的引用,但是等到我们使用r的时候,s2已经释放了,Rust是会消除一切可能导致危险的情况

生命周期注释

生命周期注释是描述引用生命周期的方法,相当于是给生命周期做一个标记

虽然这样并不能改变引用的生命周期,但是可以在合适的地方声明两个引用的生命周期一致

例如说

&i32        // 常规引用
&'a i32     // 含有生命周期注释的引用
&'a mut i32 // 可变型含有生命周期注释的引用

然后我们就可以用生命周期注释来改造这个函数

fn longer<'a>(s1: &'a str, s2: &'a str) -> &'a str {if s2.len() > s1.len() {s2} else {s1}
}

调用的时候就可以正常调用了

fn main() {let r;{let s1 = "rust";let s2 = "ecmascript";r = longer(s1, s2);println!("{} is longer", r);}
}

结构体如何使用字符串

之前的样例中,我们使用字符串都是使用的String类型,而不是str类型,主要就是考虑到生命周期的问题

那如果我们需要使用str,就需要设定生命周期

struct Str<'a> {content: &'a str}

这里定义了一个Str结构体,包含一个str类型的字符串,生命周期和结构体生命周期相同

然后使用是这样的

fn main() {let s = Str {content: "string_slice"};println!("s.content = {}", s.content);
}

这里都是没有问题的

那如果我们要给这个结构体赋予一个方法

impl<'a> Str<'a> {fn get_content(&self) -> &str {self.content}
}

这里的返回值类型没有写生命周期注释,加不加都可以的,现在已经可以自动判断生命周期了

静态生命周期

生命周期还有一个注释,'static,所有使用双引号包括的字符串都是`&'static str

表示生命周期从程序的开始一直到程序的结束

Rust文件与IO

接收命令行参数

我们在学C/C++的时候是通过main函数接收参数的,一个字符串数组

但是Rust的main函数是一个午餐的函数,环境的参数是直接通过std::env直接取出来的

例如

fn main() {let args = std::env::args();println!("{:?}", args);
}

这个打印出来的第一个参数是当前运行的目录,而后续的参数可能是环境变量或者是命令行参数

命令行输入

我们可以直接使用std::io这个模块来调用输入

use std::io::stdin;fn main() {
let mut str_buf = String::new();stdin().read_line(&mut str_buf).expect("Failed to read line.");println!("Your input line is \n{}", str_buf);
}

read_line可以直接读取一行信息到缓冲区,返回值是Result枚举,用于传递读取中的错误,可以用expect或者unwrap方法来处理错误

Rust中还没有提供直接从命令行读取数字或者格式化数据的方法,主要还是读取一行字符串,然后再用字符串识别函数处理数据

文件读取

这个就是用std::fs模块即可

例如

use std::fs;fn main() {let text = fs::read_to_string("~\text.txt").unwrap();println!("{}", text);
}

如果要读取二进制文件,则直接使用模块中的read函数即可

如果是需要读取大型文件,则可能需要流式处理的方式

例如说

use std::io::prelude::*;
use std::fs;fn main() {let mut buffer = [0u8; 5];let mut file = fs::File::open("~\text.txt").unwrap();file.read(&mut buffer).unwrap();println!("{:?}", buffer);file.read(&mut buffer).unwrap();println!("{:?}", buffer);
}

File是描述文件的一个类,打开文件之后,就可以获取一个文件对象

然后可以通过对象的read方法读取字节到缓冲区,读取的字节数等于缓冲区的长度

文件写入

文件写入也分为一次写入和流式写入,流写入有打开方式,可以设置create和append

一次写入很简单

use std::fs;fn main() {fs::write("~\text.txt", "FROM RUST PROGRAM").unwrap();
}

流写入create需要调用对应的方法

use std::io::prelude::*;
use std::fs::File;fn main() {let mut file = File::create("~\text.txt").unwrap();file.write(b"FROM RUST PROGRAM").unwrap();
}

写入的话就需要设置为mut

append就需要OpenOptions来设置

use std::io::prelude::*;
use std::fs::OpenOptions;fn main() -> std::io::Result<()> {let mut file = OpenOptions::new().append(true).open("~\text.txt")?;file.write(b" APPEND WORD")?;Ok(())
}

相关文章:

Rust生命周期、文件与IO

文章目录 Rust生命周期生命周期注释结构体如何使用字符串静态生命周期 Rust文件与IO接收命令行参数命令行输入文件读取文件写入 Rust生命周期 终于讲到Rust最重要的机制之一了&#xff0c;生命周期机制 我们先复习一下垂悬引用 {let r;{let x 5;r &x;}println!("…...

22、字节与字符的概念以及二者有什么区别?

1、概念 字节&#xff08;byte&#xff09; 定义&#xff1a;字节是计算机信息技术中用于计量存储容量和传输容量的一种单位&#xff0c;通常由8个二进制位&#xff08;bit&#xff09;组成。 作用&#xff1a;字节是计算机存储和处理信息的基本单位&#xff0c;用于衡量数据…...

APP端测试

一、功能测试 1. 核心测试点 安装/卸载/升级&#xff1a;验证不同安装方式&#xff08;应用商店/APK/IPA&#xff09; 注册登录&#xff1a;多种登录方式测试&#xff08;手机号、第三方账号&#xff09; 核心业务流程&#xff1a;支付流程、内容发布等关键路径 中断测试&a…...

Langchain-构建向量数据库和检索器

向量数据库安装 pip install langchain-chroma 文档》向量存储》向量数据库。 和0416 提示词工程相同。 初始化 import osfrom langchain_chroma import Chroma from langchain_community.chat_message_histories import ChatMessageHistory from langchain_core.documents im…...

PPT无法编辑怎么办?原因及解决方法全解析

在日常办公中&#xff0c;我们经常会遇到需要编辑PPT的情况。然而&#xff0c;有时我们会发现PPT文件无法编辑&#xff0c;这可能由多种原因引起。今天我们来看看PPT无法编辑的几种常见原因&#xff0c;并提供实用的解决方法&#xff0c;帮助你轻松应对。 原因1&#xff1a;文…...

PH热榜 | 2025-04-17

1. Mailgo 标语&#xff1a;一款利用人工智能的冷邮件平台&#xff0c;能够提升邮件送达率。 介绍&#xff1a;Mailgo将AI线索寻找助手、智能日程安排和预热账户集成到一个直观的平台上——帮助销售团队和创业者高效到达客户邮箱&#xff0c;轻松扩展业务&#xff0c;并加快转…...

maptalks矩形绘制结束后,获取最大经度最大纬度,最小经度最小纬度,从左上角开始依次获取并展示坐标

maptalks矩形绘制结束后&#xff0c;获取最大经度最大纬度&#xff0c;最小经度最小纬度&#xff0c;从左上角开始依次获取并展示坐标 重点 // 获取绘制的矩形图形对象const rectangle param.geometry;// 获取矩形外接矩形范围&#xff08;西南角/东北角坐标&#xff09;cons…...

网页图像优化:现代格式与响应式技巧

网页图像优化&#xff1a;现代格式与响应式技巧 网页图像如果处理不好&#xff0c;很容易拖慢加载速度&#xff0c;影响用户体验。这篇文章聊聊怎么用现代图像格式和响应式技巧&#xff0c;让你的网站图片加载更快、效果更好。 推荐的图像格式 选对图像格式&#xff0c;能在保…...

python中参数前**的含义

在Python中&#xff0c;参数前的 ** 表示该参数是一个“关键字参数”或者说是“可变关键字参数”。这种参数允许函数接受任意数量的关键字参数&#xff0c;并将这些参数存储在一个名为**kwargs的字典中。这使得函数可以接收任意数量的键值对参数&#xff0c;这在编写需要处理多…...

内存编码手册:整数与浮点数的二进制世界

1.整数在内存中的存储 之前在学习操作符的博文中&#xff0c;我们就已经学习了整数在内存中存储的一些基本知识&#xff0c;我们来快速回忆一下&#xff0c;并开始学习新的知识。 之前的学习中&#xff0c;我们知道整数的二进制表示方法有三种&#xff0c;即原码&#xff0c;…...

铷元素的市场供需情况如何?

铷元素的市场供需格局呈现出显著的稀缺性与战略价值&#xff0c;其供应高度依赖锂矿开采的副产品&#xff0c;而需求则随着高科技产业的快速发展持续攀升。以下从供应、需求、价格、政策及可持续性五个维度展开分析&#xff1a; 一、供应端&#xff1a;资源稀缺与技术瓶颈并存…...

MATLAB 程序实现了一个层次化光网络的数据传输模拟系统

% 主程序 num_pods = 4; % Pod 数量 num_racks_per_pod = 4; % 每个 Pod 的 Rack 数量 num_nodes_per_rack = 4; % 每个 Rack 的 Node 数量 max_wavelength = 50; % 可用波长数(根据冲突图动态调整) num_packets = 1000; % 模拟的…...

LFI to RCE

LFI不止可以来读取文件&#xff0c;还能用来RCE 在多道CTF题目中都有LFItoRCE的非预期解&#xff0c;下面总结一下LFI的利用姿势 1. /proc/self/environ 利用 条件&#xff1a;目标能读取 /proc/self/environ&#xff0c;并且网页中存在LFI点 利用方式&#xff1a; 修改请…...

QT6 源(34):随机数生成器类 QRandomGenerator 的源码阅读

&#xff08;1&#xff09;代码来自 qrandom.h &#xff0c;结合官方的注释&#xff1a; #ifndef QRANDOM_H #define QRANDOM_H#include <QtCore/qalgorithms.h> #include <algorithm> // for std::generate #include <random> // for std::mt1993…...

极狐GitLab GEO 功能介绍

极狐GitLab 是 GitLab 在中国的发行版&#xff0c;关于中文参考文档和资料有&#xff1a; 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 Geo (PREMIUM SELF) Geo 是广泛分布的开发团队的解决方案&#xff0c;可作为灾难恢复策略的一部分提供热备份。Geo 不是 开箱…...

快速上手,OceanBase + MCP + LLM,搭建 AI 应用

在 AI 技术发展的进程中&#xff0c;大语言模型&#xff08;LLM&#xff09;凭借卓越的信息处理与推理能力广受重视。然而&#xff0c;数据孤岛问题仍是 LLM 面临的核心挑战。目前&#xff0c;LLM 的推理主要依赖于预先训练的数据和有限的上下文窗口&#xff0c;既无法动态访问…...

【Python爬虫基础篇】--1.基础概念

目录 1.爬虫--定义 2.爬虫--组成 3.爬虫--URL 1.爬虫--定义 网络爬虫&#xff0c;是一种按照一定规则&#xff0c;自动抓取互联网信息的程序或者脚本。另外一些不常使用的名字还有蚂蚁、自动索引、模拟程序或者蠕虫。随着网络的迅速发展&#xff0c;万维网成为大量信息的载体…...

Linux :进程替换

进程替换 &#xff08;一&#xff09;进程程序替换1.替换原理2.替换函数exec函数命名理解 &#xff08;二&#xff09;实现简易shell &#xff08;一&#xff09;进程程序替换 1.替换原理 用fork创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往…...

XC7K410T‑2FFG900I 赛灵思XilinxFPGA Kintex‑7

XC7K410T‑2FFG900I Xilinx 赛灵思FPGA Kintex‑7 系列定位&#xff1a;Kintex‑7 中端&#xff0c;高性价比与高性能平衡 工艺节点&#xff1a;28 nm HPL&#xff08;High‑Performance, Low‑Power&#xff09;HKMG&#xff08;High‑κ Metal Gate&#xff09; 逻辑资源&…...

list容器介绍及模拟实现和与vector比较

目录 list容器介绍 lisy接口 list迭代器的注意事项 迭代器失效 list的模拟实现 list的节点 list的迭代器实现 list的接口实现 vector和list的优缺点 vector优点&#xff1a; vector缺点&#xff1a; list优点&#xff1a; list缺点&#xff1a; 总结&#xff1a; …...

[图论]Prim

Prim 本质&#xff1a;BFS贪心&#xff0c;对点进行操作。与最短路Dijkstra算法是“孪生兄弟”。存储结构&#xff1a;链式前向星适用对象&#xff1a;可为负权图&#xff0c;可求最大生成树核心思想&#xff1a;最近的邻接点一定在最小生成树(MST)上&#xff0c;对点的最近邻…...

【python】pysharm常用快捷键使用-(1)

*1.格式化代码【Ctrl Alt L】 写代码的时候会有很多黄色的波浪号&#xff08;如图&#xff09;又叫蚂蚁线&#xff0c;可以点击任意黄色波浪号的代码&#xff0c;然后按下【Ctrl Alt L】进行代码格式化。 2.添加函数功能和参数注释 添加函数文档字符串 docstring 在函数…...

06-DevOps-自动构建Docker镜像

前面已经完成了jar文件的打包和发布&#xff0c;但在实际使用时&#xff0c;可能会遇到外部依赖环境发生改变&#xff0c;为了解决这些问题&#xff0c;更多的做法是把应用程序以docker镜像&#xff0c;生成容器的方式运行&#xff0c;这是一种标准化的方式。 创建Dockerfile文…...

案例驱动的 IT 团队管理:创新与突破之路:第五章 创新管理:从机制设计到文化养成-5.2 技术决策民主化-5.2.2技术选型的量化评估矩阵

&#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 &#x1f449; 点击关注不迷路 文章大纲 案例驱动的 IT 团队管理&#xff1a;创新与突破之路 - 第五章 创新管理&#xff1a;从机制设计到文化养成 - 5.2 技术决策民主化5.2.2 技术选型的量化评估矩阵一、技术选型的…...

力扣面试150题--有效的字母异位词和字母异位词分组

Day 24 题目描述 思路 初次思路&#xff1a;如果两个字符串为异位词&#xff0c;说明它们长度相同并且字母出现的次数相同&#xff0c;于是有以下做法&#xff1a; 定义一个map&#xff0c;来保存s中每个字符的出现次数处理特殊情况&#xff0c;如果长度不同&#xff0c;直接…...

WSL2-Ubuntu22.04安装URSim5.21.3

WSL2-Ubuntu22.04安装URSim5.21.3 准备安装启动 准备 名称版本WSL2Ubuntu22.04URSim5.21.3VcXsrvNaN WSL2安装与可视化请见这篇:WSL2-Ubuntu22.04-配置。 安装 我们是wsl2-ubuntu22.04&#xff0c;所以安装Linux版本的URSim&#xff0c;下载之前需要注册一下&#xff0c;即…...

配合 Spring Bean 注入,把 Function 管理起来?

大家好呀&#xff01;今天我们来聊聊一个特别有意思的话题 - 如何在Spring中优雅地管理和注入Function对象。就像把各种调料整齐地摆在厨房里一样&#xff0c;我们要把各种函数方法也管理得井井有条&#xff01;&#x1f373; 一、为什么要把Function管起来&#xff1f;&#…...

Wireshark TS | 异常 ACK 数据包处理

问题背景 来自于学习群里群友讨论的一个数据包跟踪文件&#xff0c;在其中涉及到两处数据包异常现象&#xff0c;而产生这些现象的实际原因是数据包乱序。由于这两处数据包异常&#xff0c;都有点特别&#xff0c;本篇也就其中一个异常现象单独展开说明。 问题信息 数据包跟…...

vue3 el-dialog新增弹窗,不希望一进去就校验名称没有填写

就是在进入弹窗时、点击关闭/取消按钮时等情况清空该表单校验&#xff0c;在失去焦点或者点击确定/提交按钮的时候再去校验。这里默认已经写好了在失去焦点或者点击确定/提交按钮的时候的校验逻辑。 解决步骤&#xff1a; 一、定义清空表单校验方法 // 清空表单校验const cle…...

【2-12】CRC循环冗余校验码

前言 前面我们介绍了纠错码——海明码&#xff0c;同时还说明了为什么现代网络常用检错重传而不是纠错&#xff0c;本文介绍CRC循环冗余校验码。 文章目录 前言1. 简单定义2. 生成规则3. 例题3.1 例13.2 例2 后记修改记录 1. 简单定义 CRC&#xff08;Cyclic Redundancy Chec…...

多 Agent 协作怎么整:从谷歌A2A到多Agent交互方案实现

写在前面:多 Agent 协作模式 大型语言模型(LLM)的浪潮之下,能够自主理解、规划并执行任务的 AI Agent(智能体)正成为人工智能领域最炙手可热的焦点。我们惊叹于单个 Agent 展现出的强大能力,但当面对日益复杂的现实世界任务时,单个 Agent 的局限性也逐渐显现。 正如人…...

内部聊天软件,BeeWorks-安全的企业内部通讯软件

企业在享受数据便利的同时&#xff0c;如何保障企业数据安全已经成为无法回避的重要课题。BeeWorks作为一款专为企业设计的内部通讯软件&#xff0c;通过全链路的安全能力升维&#xff0c;为企业提供了一个安全、高效、便捷的沟通协作平台&#xff0c;全面保障企业数据安全。 …...

健康养生:开启活力生活的密钥

当我们在健身房看到年逾六旬却身形矫健的老人&#xff0c;在公园偶遇精神矍铄、步伐轻快的长者&#xff0c;总会惊叹于他们的健康状态。其实&#xff0c;这些都得益于长期坚持科学的养生之道。健康养生并非遥不可及的玄学&#xff0c;而是融入生活细节的智慧。​ 在饮食的世界…...

士兵乱斗(贪心)

问题 B: 士兵乱斗 - USCOJ...

Android 不插SIM卡,手机不能拨打紧急电话;2g+gsm配置才支持112紧急拨号

[DESCRIPTION] 不插SIM卡&#xff0c;手机不能拨打紧急电话 Root Cause 手机没有写入合法的IMEI;或者当地的某个运营商不支持紧急电话&#xff0c;而手机正好选上了这个运营商;或者当地的某个运营商不支持无SIM卡的紧急电话&#xff0c;而手机正好选上了这个运营商 [SOLUTION] …...

Freertos----信号量

一、信号量的特性&#xff1a; 生产者为任务A、B&#xff0c;消费者为任务C、D一开始信号量的计数值为0&#xff0c;如果任务C、D想获得信号量&#xff0c;会有两种结果&#xff1a; 阻塞&#xff1a;买不到东西咱就等等吧&#xff0c;可以定个闹钟(超时时间)即刻返回失败&…...

AI 数字短视频数字人源码开发的多元价值与深远意义​

在短视频行业竞争日益激烈的当下&#xff0c;AI 数字短视频数字人源码开发正以颠覆性的姿态&#xff0c;为行业带来诸多前所未有的优势&#xff0c;从创作、传播到商业变现等环节&#xff0c;全面重塑短视频生态。​ 创新创作模式&#xff0c;激发无限创意​ 传统短视频创作受…...

Apifox下载安装与使用

一、Apifox下载 官网地址:Apifox 点击"免费下载",即可进行下载。 二、Apifox安装 双击安装文件即可安装。...

命令行参数解析 - argparse 模块

1、简介 argparse 模块是 Python 标准库中提供的一个 命令行解析模块 &#xff0c;它可以让使用者以类似 Unix/Linux 命令参数的方式输入参数&#xff08;在终端以命令行的方式指定参数&#xff09;&#xff0c;argparse 会自动将命令行指定的参数解析为 Python 变量&#xff…...

【Android】 如何将 APK 内置为系统应用(适用于编辑设置属性)

如何将 APK 内置为系统应用(适用于编辑设置属性) 在 Android 中&#xff0c;将 APK 文件内置为系统应用涉及到一系列的命令和步骤。以下是详细的操作流程&#xff0c;帮助您解决常见问题&#xff0c;如 /system not in /proc/mounts 的错误。 挂载system/app获取可读写权限 …...

随手笔记-python-opencv 读取图像的顺序 与pytorch处理图像的顺序

import cv2# 读取图像 image_path path/to/your/image.jpg # 替换为你的图像路径 image cv2.imread(image_path)# 检查图像是否成功读取 if image is None:print("Error: Unable to load image.") else:print("Image loaded successfully.") 1、OpenCV…...

996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容

996引擎-实战笔记:Lua 的 NPC 面板获取 Input 内容 获取 Input 内容测试NPC参考资料获取 Input 内容 测试NPC -- NPC入口函数 function main(player)local msg = [[<Img|id=9527|x=0|y=0|width=300|height=150|img=public/bg_npc_01.png|bg=1|move=1|reset=1|show=0|layer…...

少数服从多数悖论、黑白颠倒与众人孤立现象之如何应对(一)

观己之前&#xff0c;也可先观众生 如果当时没有袖手旁观&#xff0c;或许唇不亡齿也不会寒 ■如何轻松/更好应对个别被众人孤立&#xff08;他人、辨别、自己&#xff09; ●他人被孤立 不参与 有余力&#xff0c;助弱者 被孤立者本身有问题 •不参与&#xff1a;不会辨…...

大模型在急性单纯性阑尾炎预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的 1.3 研究方法与创新点 二、急性单纯性阑尾炎概述 2.1 定义与发病机制 2.2 临床表现 2.3 传统诊断方法 三、大模型在急性单纯性阑尾炎预测中的应用 3.1 大模型简介 3.2 数据收集与处理 3.3 模型训练与优化 3.4 预测…...

科研新触角:松灵六轴臂重构具身智能生态

在具身智能&#xff08;Embodied AI&#xff09;从实验室走向产业化的进程中&#xff0c;硬件性能与场景适配性成为技术落地的核心瓶颈。松灵机器人推出的全自研科研级轻量六轴机械臂PiPER&#xff0c;以“轻量化设计毫米级精度跨平台兼容”三大技术突破&#xff0c;重新定义了…...

第四讲 感应熔炼电炉设计和感应器参数计算(中)

第四讲 感应熔炼电炉设计和感应器参数计算&#xff08;中&#xff09; 目录 第四讲 感应熔炼电炉设计和感应器参数计算&#xff08;中&#xff09;磁轭、短路环、消磁环、水冷圈的设计1. 磁轭的设计1.1 磁轭的作用1.2 磁轭的材料1.3 磁轭截面设计1.4 磁轭高度的确定1.5 磁轭总重…...

【Contiki】Contiki源码目录结构

00. 目录 文章目录 00. 目录01. 概述02. Contiki目录结构03. apps目录04. core目录05. CPU目录06. doc目录07. examples目录08. platform目录09. regression-tests目录10. tools目录11. 附录 01. 概述 Contiki是一款开源操作系统&#xff0c;专为微小的低功耗微控制器设计&…...

第五章 SQLite数据库:3、SQLite 常用语法及使用案例

SQLite Insert 语句 SQLite 的 INSERT INTO 语句用于向表中添加新数据行。 语法 INSERT INTO 有两种常见语法形式&#xff1a; 使用列名指定要插入的列&#xff1a; -- 插入数据并指定列名 INSERT INTO TABLE_NAME (column1, column2, ..., columnN) VALUES (value1, va…...

【安卓开发】【Android Studio】Menu(菜单栏)的使用及常见问题

一、菜单栏选项 在项目中添加顶部菜单栏的方法&#xff1a; 在res目录下新建menu文件夹&#xff0c;在该文件夹下新建用于菜单栏的xml文件&#xff1a; 举例说明菜单栏的写法&#xff0c;只添加一个选项元素&#xff1a; <?xml version"1.0" encoding"ut…...

web-ssrfme

SSRF漏洞 SSRF是Server-Side Request Forgery&#xff08;服务器端请求伪造&#xff09;的缩写&#xff0c;是一种网络攻击技术。攻击者发送恶意请求给目标服务器&#xff0c;让服务器去访问攻击者指定的其他服务器或者域名&#xff0c;从而获取敏感信息或者攻击其他系统。 S…...