【gRPC-gateway】option定义规则及HttpBody响应
HTTP Option 定义规则
在 .proto 文件中,通过 google.api.http 注解定义 HTTP 路由规则,控制请求参数映射
需要在.proto文件显式
import https://github.com/googleapis/googleapis/tree/master/google/api
一、HTTP Option 定义规则详解
1. 基础路由定义
核心属性说明
属性 | 作用 | 底层原理 |
---|---|---|
HTTP 方法 ( get /post /put /patch /delete ) | 定义 RESTful 接口的 HTTP 动作 | 映射到 http.Request 的 Method 字段,路由匹配时校验方法一致性 |
body | 指定 HTTP 请求体的映射规则 | 决定将请求体中的 JSON 数据解析到 Protobuf 消息的哪个字段 |
response_body | 控制 HTTP 响应体的数据来源(默认返回完整消息,可指定子字段) | 序列化响应时仅提取指定字段,其他字段将被忽略 |
关键场景示例
场景 1:简单 GET 请求
rpc GetUser(GetUserRequest) returns (User) {
option (google.api.http) = {
get: "/v1/users/{user_id}" // 路径参数 user_id 映射到 GetUserRequest.user_id
};
}message GetUserRequest {
string user_id = 1; // 必须与路径参数名称一致
}
请求映射逻辑:
HTTP GET /v1/users/123 → GetUserRequest{user_id: "123"}
场景 2:POST 请求体映射
rpc CreateUser(CreateUserRequest) returns (User) {
option (google.api.http) = {
post: "/v1/users"
body: "user" // 请求体映射到 CreateUserRequest.user 字段
};
}message CreateUserRequest {
User user = 1; // 接收请求体数据
}
请求示例:
POST /v1/users
{
"name": "Alice",
"email": "alice@example.com"
}
映射结果:
CreateUserRequest{
user: User{name: "Alice", email: "alice@example.com"}
}
场景 3:混合参数绑定
rpc UpdateUser(UpdateUserRequest) returns (User) {
option (google.api.http) = {
patch: "/v1/users/{id}"
body: "*" // 整个请求体映射到 UpdateUserRequest
};
}message UpdateUserRequest {
string id = 1; // 来自路径参数
string name = 2; // 来自请求体
int32 age = 3; // 来自请求体
}
请求示例:
PATCH /v1/users/456
{
"name": "Bob",
"age": 30
}
映射结果:
UpdateUserRequest{
id: "456",
name: "Bob",
age: 30
}
2. body
属性的高级用法
规则对比表
语法 | 行为 | 适用场景 |
---|---|---|
body: "*" | 整个请求体映射到 顶层消息对象 | 简单请求,无额外路径/查询参数 |
body: "field" | 请求体映射到消息的 指定字段,其他字段从路径/查询参数获取 | 混合参数请求(如更新操作) |
body: "" | 禁用请求体映射,所有字段必须来自路径或查询参数 | GET/DELETE 等无 Body 请求 |
代码示例:body: "field"
的嵌套结构
rpc CreatePost(CreatePostRequest) returns (Post) {
option (google.api.http) = {
post: "/v1/posts"
body: "post_data" // 请求体映射到 post_data 字段
};
}message CreatePostRequest {
string author_id = 1; // 必须通过查询参数传递 ?author_id=xxx
PostData post_data = 2; // 来自请求体
}message PostData {
string title = 1;
string content = 2;
}
请求示例:
POST /v1/posts?author_id=789
{
"title": "Hello gRPC",
"content": "This is a tutorial..."
}
映射结果:
CreatePostRequest{
author_id: "789",
post_data: PostData{
title: "Hello gRPC",
content: "This is a tutorial..."
}
}
3. response_body
的深度应用
默认行为 vs 指定字段
- 未设置
response_body
:
rpc GetBook(GetBookRequest) returns (BookResponse) {
option (google.api.http) = {
get: "/v1/books/{id}"
};
}message BookResponse {
Book book = 1;
Metadata meta = 2;
}
响应结果:
{
"book": {...},
"meta": {...}
}
- 设置
response_body: "book"
:
rpc GetBook(GetBookRequest) returns (BookResponse) {
option (google.api.http) = {
get: "/v1/books/{id}"
response_body: "book" // 仅返回 book 字段
};
}
响应结果:
{
"title": "gRPC Guide",
"author": "..."
}
典型应用场景
-
精简响应数据
隐藏内部元数据字段(如分页信息、服务状态码) -
直接返回子对象
当响应消息包含包装层时,直接暴露核心数据 -
兼容旧版 API
维持响应结构不变的情况下修改 Protobuf 定义
4. 特殊语法与边界条件
路径参数冲突处理
// ❌ 错误示例:路径参数与 body 字段同名
rpc ConflictExample(ConflictRequest) returns (Empty) {
option (google.api.http) = {
post: "/v1/test/{id}"
body: "*"
};
}message ConflictRequest {
string id = 1; // 同时来自路径参数和请求体,导致解析冲突
}
解决方案:
- 修改字段名称
- 使用
body: "other_field"
避免覆盖
HttpBody 响应
HttpBody 是 gRPC-Gateway 中用于处理 非结构化响应数据 的核心机制。它允许直接返回二进制数据(如文件、图像、视频等),突破默认的 JSON 格式限制。
一、核心特性与使用场景
特性 | 说明 | 典型场景 |
---|---|---|
原始二进制支持 | 直接返回未经 JSON 序列化的数据 | 文件下载(PDF、图片、音视频) |
自定义 Content-Type | 可指定任意 MIME 类型(如 image/png ) | 返回特定格式数据(XML、CSV) |
流式传输兼容 | 可与 gRPC 流式结合使用(需自定义实现) | 大文件分块传输 |
低延迟处理 | 避免 JSON 序列化/反序列化开销 | 高性能二进制协议交互 |
二、Protobuf 定义详解
1. 基本定义格式
import "google/api/httpbody.proto"; // 必须导入service FileService {// 返回 HttpBody 类型rpc DownloadFile(FileRequest) returns (google.api.HttpBody) {option (google.api.http) = {get: "/v1/files/{name}"};}
}
2. 关键字段说明
HttpBody 的 Protobuf 定义如下:
message HttpBody {string content_type = 1; // 必须指定 MIME 类型bytes data = 2; // 原始二进制数据map<string, string> extensions = 3; // 扩展元数据(较少使用)
}
三、服务端实现(Go 示例)
1. 返回静态文件
func (s *FileServer) DownloadFile(ctx context.Context, req *pb.FileRequest) (*httpbody.HttpBody, error) {// 读取文件内容data, err := os.ReadFile("/path/to/files/" + req.Name)if err != nil {return nil, status.Error(codes.NotFound, "file not found")}// 构造 HttpBody 响应return &httpbody.HttpBody{ContentType: "application/pdf", // 根据实际文件类型修改Data: data,}, nil
}
2. 动态生成二进制数据
func (s *ChartService) GenerateChart(ctx context.Context, req *pb.ChartRequest) (*httpbody.HttpBody, error) {// 生成图表(示例使用伪代码)img := generatePNGChart(req.Data)return &httpbody.HttpBody{ContentType: "image/png",Data: img.Bytes(),}, nil
}
四、客户端请求示例
1. 直接通过浏览器下载
# 访问 URL 触发文件下载
http://localhost:8080/v1/files/report.pdf
2. 使用 curl 获取二进制数据
curl -v http://localhost:8080/v1/files/image.jpg --output result.jpg
3. 前端 JavaScript 处理
fetch('/v1/files/image.jpg').then(response => response.blob()).then(blob => {const url = window.URL.createObjectURL(blob);const a = document.createElement('a');a.href = url;a.download = 'image.jpg';a.click();});
五、高级配置与技巧
1. 自定义 Content-Type 规则
// 根据文件扩展名动态设置 Content-Type
func getContentType(filename string) string {switch path.Ext(filename) {case ".pdf": return "application/pdf"case ".png": return "image/png"case ".csv": return "text/csv"default: return "application/octet-stream"}
}
2. 流式传输大文件
虽然 HttpBody 本身不支持流式,但可通过以下方式实现分块传输:
func (s *FileServer) StreamFile(req *pb.FileRequest, stream pb.FileService_StreamFileServer) error {file, _ := os.Open(req.Name)defer file.Close()buffer := make([]byte, 1024*1024) // 1MB 分块for {n, err := file.Read(buffer)if err == io.EOF {break}stream.Send(&httpbody.HttpBody{ContentType: "application/octet-stream",Data: buffer[:n],})}return nil
}
六、注意事项与调试指南
1. 常见问题排查表
问题现象 | 可能原因 | 解决方案 |
---|---|---|
返回数据被 JSON 编码 | 未正确设置为 HttpBody 返回类型 | 检查 .proto 文件导入和类型定义 |
Content-Type 未生效 | 服务端未设置 content_type 字段 | 确保在 HttpBody 中显式指定类型 |
中文文件名乱码 | 未设置 Content-Disposition 头 | 通过 Metadata 添加额外响应头 |
2. 添加响应头示例
// 在拦截器中设置响应头
func setDownloadHeader(ctx context.Context, w http.ResponseWriter, resp proto.Message) {if body, ok := resp.(*httpbody.HttpBody); ok {filename := "export.csv"w.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=\"%s\"", filename))}
}// 注册到 ServeMux
mux := runtime.NewServeMux(runtime.WithForwardResponseOption(setDownloadHeader),
)
七、性能优化建议
-
启用 Gzip 压缩
在网关层配置压缩中间件:handler := gziphandler.GzipHandler(mux) http.ListenAndServe(":8080", handler)
-
内存优化
避免一次性加载大文件到内存,使用io.Reader
流式处理:func streamFile(path string) (io.Reader, error) {return os.Open(path) }
-
CDN 集成
对于静态文件,直接返回重定向 URL:return &httpbody.HttpBody{ContentType: "text/plain",Data: []byte("https://cdn.example.com/files/report.pdf"), }, nil
八、与普通响应的对比
特性 | 普通响应(JSON) | HttpBody 响应 |
---|---|---|
数据格式 | 强制 JSON 序列化 | 保持原始二进制格式 |
Content-Type | application/json (固定) | 可自由定义(如 image/jpeg ) |
元数据支持 | 通过响应消息字段携带 | 需通过 HTTP 头或自定义协议封装 |
性能开销 | 有序列化/反序列化成本 | 零转换开销(适合大文件) |
https://github.com/0voice
相关文章:
【gRPC-gateway】option定义规则及HttpBody响应
HTTP Option 定义规则 在 .proto 文件中,通过 google.api.http 注解定义 HTTP 路由规则,控制请求参数映射 需要在.proto文件显式 import https://github.com/googleapis/googleapis/tree/master/google/api 一、HTTP Option 定义规则详解 1. 基础路由…...
rsync安装与使用-linux015
使用 rsync 可以非常高效地将文件或目录从一个服务器传输到另一个服务器。 能力: 支持 64 位文件、64 位 inode、64 位时间戳、64 位长整型支持套接字对、符号链接、符号链接时间、硬链接、硬链接特殊文件、硬链接符号链接支持 IPv6、访问时间(atimes&…...
一种用于低成本水质监测的软传感器开源方法:以硝酸盐(NO3⁻)浓度为例
论文标题 A Soft Sensor Open-Source Methodology for Inexpensive Monitoring of Water Quality: A Case Study of NO3− Concentrations 作者信息 Antonio Jess Chaves, ITIS Software, University of Mlaga, 29071 Mlaga, Spain Cristian Martn, ITIS Software, Universi…...
剑指 Offer II 011. 0 和 1 个数相同的子数组
comments: true edit_url: https://github.com/doocs/leetcode/edit/main/lcof2/%E5%89%91%E6%8C%87%20Offer%20II%20011.%200%20%E5%92%8C%201%20%E4%B8%AA%E6%95%B0%E7%9B%B8%E5%90%8C%E7%9A%84%E5%AD%90%E6%95%B0%E7%BB%84/README.md 剑指 Offer II 011. 0 和 1 个数相同的子…...
games101-作业3
由于此次试验需要加载模型,涉及到本地环节,如果是windows系统,需要对main函数中的路径稍作改变: 这么写需要: #include "windows.h" 该段代码: #include "windows.h" int main(int ar…...
信息安全专业优秀毕业设计选题汇总:热点选题
目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光,一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…...
AI协助探索AI新构型的自动化创新概念
训练AI自生成输出模块化代码,生成元代码级别的AI功能单元代码,然后再由AI组织为另一个AI,实现AI开发AI的能力;用AI协助探索迭代新构型AI将会出现,并成为一种新的技术路线潮流。 有限结点,无限的连接形式&a…...
python——Django 框架
Django 框架 1、简介 Django 是用python语言写的开源web开发框架,并遵循MVC设计。 Django的**主要目的是简便、快速的开发数据库驱动的网站。**它强调代码复用,多个组件可以很方便的以"插件"形式服务于整个框架,Django有许多功能…...
SpringBoot基础概念介绍-数据源与数据库连接池
🙋大家好!我是毛毛张! 🌈个人首页: 神马都会亿点点的毛毛张 毛毛张今天介绍的SpringBoot中的基础概念-数据源与数据库连接池,同时介绍SpringBoot整合两种连接池的教程 文章目录 1 数据库与数据库管理系统2 JDBC与数…...
MYSQL 商城系统设计 商品数据表的设计 商品 商品类别 商品选项卡 多表查询
介绍 在开发商品模块时,通常使用分表的方式进行查询以及关联。在通过表连接的方式进行查询。每个商品都有不同的分类,每个不同分类下面都有商品规格可以选择,每个商品分类对应商品规格都有自己的价格和库存。在实际的开发中应该给这些表进行…...
视频网站服务器为什么需要使用负载均衡?
随着视频网站等娱乐活动的逐渐增加,进行使用的用户数量也在不断上升,大量的用户会给视频网站行业带来一定的访问压力,需要处理大量的媒体资料,比如上传视频图片和数据保存发布等内容,会消耗大量的带宽资源,…...
Golang Gin系列-9:Gin 集成Swagger生成文档
文档一直是一项乏味的工作(以我个人的拙见),但也是编码过程中最重要的任务之一。在本文中,我们将学习如何将Swagger规范与Gin框架集成。我们将实现JWT认证,请求体作为表单数据和JSON。这里唯一的先决条件是Gin服务器。…...
docker中运行的MySQL怎么修改密码
1,进入MySQL容器 docker exec -it 容器名 bash 我运行了 docker ps命令查看。正在运行的容器名称。可以看到MySQL的我起名为db docker exec -it db bash 这样就成功的进入到容器中了。 2,登录MySQL中 mysql -u 用户名 -p 回车 密码 mysql -u root -p roo…...
智能汽车网络安全威胁报告
近年来随着智能汽车技术的快速发展,针对智能汽车的攻击也逐渐从传统的针对单一车辆控制器的攻击转变为针对整车智能化服务的攻击,包括但不限于对远程控制应用程序的操控、云服务的渗透、智能座舱系统的破解以及对第三方应用和智能服务的攻击。随着WP.29 …...
[EAI-026] DeepSeek-VL2 技术报告解读
Paper Card 论文标题:DeepSeek-VL2: Mixture-of-Experts Vision-Language Models for Advanced Multimodal Understanding 论文作者:Zhiyu Wu, Xiaokang Chen, Zizheng Pan, Xingchao Liu, Wen Liu, Damai Dai, Huazuo Gao, Yiyang Ma, Chengyue Wu, Bin…...
【腾讯云】腾讯云docker搭建单机hadoop
这里写目录标题 下载jdk hadoop修改hadoop配置编写Dockerfile构建镜像运行镜像创建客户端 下载jdk hadoop wget --no-check-certificate https://repo.huaweicloud.com/java/jdk/8u151-b12/jdk-8u151-linux-x64.tar.gz wget --no-check-certificate https://repo.huaweicloud.…...
【回溯+剪枝】电话号码的字母组合 括号生成
文章目录 17. 电话号码的字母组合解题思路:回溯 哈希表22. 括号生成解题思路:回溯 剪枝 17. 电话号码的字母组合 17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串,返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 …...
Day29(补)-【AI思考】-精准突围策略——从“时间贫困“到“效率自由“的逆袭方案
文章目录 精准突围策略——从"时间贫困"到"效率自由"的逆袭方案**第一步:目标熵减工程(建立四维坐标)** 与其他学习方法的结合**第二步:清华方法本土化移植** 与其他工具对比**~~第三步:游戏化改造…...
进程间通信
进程间通信 进程间通信介绍 进程间通信⽬的 数据传输:⼀个进程需要将它的数据发送给另⼀个进程 资源共享:多个进程之间共享同样的资源。 通知事件:⼀个进程需要向另⼀个或⼀组进程发送消息,通知它(它们)…...
【PyTorch】6.张量运算函数:一键开启!PyTorch 张量函数的宝藏工厂
目录 1. 常见运算函数 个人主页:Icomi 专栏地址:PyTorch入门 在深度学习蓬勃发展的当下,PyTorch 是不可或缺的工具。它作为强大的深度学习框架,为构建和训练神经网络提供了高效且灵活的平台。神经网络作为人工智能的核心技术&…...
2024年数据记录
笔者注册时间超过98.06%的用户 CSDN 原力是衡量一个用户在 CSDN 的贡献和影响力的系统,笔者原力值超过99.99%的用户 其他年度数据...
hot100(4)
31.437. 路径总和 III - 力扣(LeetCode) 方法一:递归、dfs 由树的结构想到使用递归解决,且路径相关问题容易考虑到使用dfs和bfs. 使用dfs解决,这里关键在于如何设计递归函数。 递归函数的参数:root,tar…...
海浪波高预测(背景调研)
#新星杯14天创作挑战营第7期# ps:图片由通义千问生成 历史工作: 针对更高细粒度、更高精度的波浪高度预测任务: Mumtaz Ali 等人提出了一种多元线性回归模型(MLR-CWLS),该模型利用协方差加权最小二乘法&a…...
C++ 3
delete 和 free 有什么区别? delete和free都是用来释放动态分配的内存,但它们有不同的使用方式: 语法: ○ delete是C中的关键字,用于释放由new分配的对象。 ○ free是C语言中的函数,通常包含在<stdlib…...
【逻辑学导论】1.4论证与说明
许多语段看起来好像是论证,实际上不是论证而是说明。即使有某些前提或结论指示词出现,例如“因为”“由于”“因”“所以”等,也不能解决问题,这些语词既可用在论证中也可用在说明中(虽然“因……”一词有时可以指时间…...
vue3+elementPlus之后台管理系统(从0到1)(day4-完结)
面包屑 创建一个面包屑组件 将路由导入然后格式化map对象 key-value 将当前路由的key和value获取然后存入list数组中 遍历list数据,渲染内容 <!--BreadcrumbCom.vue--> <template><el-breadcrumb separator">"><el-breadcrum…...
Python标准库 - os (2) 进程管理
文章目录 3 进程管理3.1 进程状态和控制3.2 进程优先级3.3 程序段控制3.4 其他 4 创建子进程4.1 创建子进程常见函数4.2 spawn*族函数4.3 exec*族函数 5 子进程管理5.1 创建子进程触发事件5.2 等待子进程执行完5.3 子进程的状态 os模块提供了各种操作系统接口。包括环境变量、进…...
单细胞-第四节 多样本数据分析,下游画图
文件在单细胞\5_GC_py\1_single_cell\2_plots.Rmd 1.细胞数量条形图 rm(list ls()) library(Seurat) load("seu.obj.Rdata")dat as.data.frame(table(Idents(seu.obj))) dat$label paste(dat$Var1,dat$Freq,sep ":") head(dat) library(ggplot2) lib…...
【2024年华为OD机试】(B卷,100分)- 热点网站统计(Java JS PythonC/C++)
一、问题描述 题目描述 企业路由器的统计页面需要动态统计公司访问最多的网页URL的Top N。设计一个算法,能够高效动态统计Top N的页面。 输入描述 每一行都是一个URL或一个数字: 如果是URL,代表一段时间内的网页访问。如果是数字N&#…...
脚本运行禁止:npm 无法加载文件,因为在此系统上禁止运行脚本
问题与处理策略 1、问题描述 npm install -D tailwindcss执行上述指令,报如下错误 npm : 无法加载文件 D:\nodejs\npm.ps1,因为在此系统上禁止运行脚本。 有关详细信息,请参阅 https:/go.microsoft.com/fwlink/?LinkID135170 中的 about_…...
AI软件栈:LLVM分析(一)
文章目录 AI 软件栈后端编译LLVM IRLLVM的相关子项目AI 软件栈后端编译 AI软件栈的后端工作通常与硬件架构直接相关,为了实现一个既能适配现代编程语言、硬件架构发展的目标,所以提出了LLVM具备多阶段优化能力提供基础后端描述,便于进行编译器开发兼容标准编译器的行为LLVM …...
【Elasticsearch】 Intervals Query
Elasticsearch Intervals Query 返回基于匹配术语的顺序和接近度的文档。 intervals 查询使用 匹配规则,这些规则由一小组定义构建而成。这些规则然后应用于指定 field 中的术语。 这些定义生成覆盖文本中术语的最小间隔序列。这些间隔可以进一步由父源组合和过滤…...
Ansys Maxwell:采用对称性的双转子轴向磁通电机
轴向磁通电机因其功率密度高于相同重量的传统径向磁通电机而变得非常受欢迎,并且在电动汽车和航空应用中非常高效且具有成本效益。功率密度是输出功率与机器体积的比率。对于给定尺寸的机器,轴向磁通电机提供更大的扭矩和功率,或者对于给定的…...
你的连接不是专用连接
当你打开网站看到如下提示,说明SSL证书到期了。 攻击者可能试图www窃取你的信息(例如、密码、消息或信用卡)。详细了解此警告 NET::ERR_CERT_DATE_INVALID 此服务器无法证明它是WWW ;它的安全证书已于2天前到期。这可能是错误配置或攻击者…...
CSS核心
CSS的引入方式 内部样式表是在 html 页面内部写一个 style 标签,在标签内部编写 CSS 代码控制整个 HTML 页面的样式。<style> 标签理论上可以放在 HTML 文档的任何地方,但一般会放在文档的 <head> 标签中。 <style> div { color: r…...
AI常见的算法和例子
人工智能(AI)中常见的算法分为多个领域,如机器学习、深度学习、强化学习、自然语言处理和计算机视觉等。以下是一些常见的算法及其用途: 例子代码:纠结哥/pytorch_learn 1. 机器学习 (Machine Learning) 监督学习 (S…...
无公网IP 外网访问 本地部署夫人 hello-algo
hello-algo 是一个为帮助编程爱好者系统地学习数据结构和算法的开源项目。这款项目通过多种创新的方式,为学习者提供了一个直观、互动的学习平台。 本文将详细的介绍如何利用 Docker 在本地安装部署 hello-algo,并结合路由侠内网穿透实现外网访问本地部署…...
【QT】 控件 -- 显示类
🔥 目录 [TOC]( 🔥 目录) 1. 前言 2. 显示类控件2.1 Label 1、显示不同文本2、显示图片3、文本对齐、自动换行、缩进、边距4、设置伙伴 3.2 LCD Number 3.3 ProgressBar 3.4 Calendar Widget 3. 共勉 🔥 1. 前言 之前我在上一篇文章【QT】…...
AI语言模型竞争加剧:新秀崛起 格局生变
标题:AI语言模型竞争加剧:新秀崛起 格局生变 文章信息摘要: AI语言模型领域呈现加速发展和分化态势。在LMSYS排行榜上,Claude 3 Opus超越GPT-4 Turbo,DBRX超越Mixtral成为最佳开源模型,显示领先位置更替频…...
RK3568使用opencv(使用摄像头捕获图像数据显示)
文章目录 一、opencv相关的类1. **cv::VideoCapture**2. **cv::Mat**3. **cv::cvtColor**4. **QImage**5. **QPixmap**总结 二、代码实现 一、opencv相关的类 1. cv::VideoCapture cv::VideoCapture 是 OpenCV 中用于视频捕捉的类,常用于从摄像头、视频文件、或者…...
leetcode——排序链表(java)
给你链表的头结点 head ,请将其按 升序 排列并返回 排序后的链表 。 示例 1: 输入:head [4,2,1,3] 输出:[1,2,3,4] 示例 2: 输入:head [-1,5,3,4,0] 输出:[-1,0,3,4,5] 示例 3: …...
Windows安装Miniconda和PySide6以及配置PyCharm
目录 1. 选择Miniconda 2. 下载Miniconda 3. 安装Miniconda 4. 在base环境下创建pyside6环境 5. 安装pyside6环境 6. 配置PyCharm环境 7. 运行第一个程序效果 1. 选择Miniconda 选择Miniconda而没有选择Anaconda,是因为它是一个更小的Anaconda发行版&#x…...
floodfill算法(6题)
本质就是找出性质相似的连通块 目录 1.图像渲染 2.岛屿数量 3.岛屿的最大面积 4.被围绕的区域 5.太平洋大西洋水流问题 6.扫雷游戏 1.图像渲染 733. 图像渲染 - 力扣(LeetCode) 我们使用深度优先遍历去遍历即可,也不需要返回值。 值得…...
Spring集成Redis|通用Redis工具类
一、基础使用 概述 在SpringBoot中一般使用RedisTemplate提供的方法来操作Redis。那么使用SpringBoot整合Redis需要 那些步骤呢。 1、 JedisPoolConfig (这个是配置连接池) 2、 RedisConnectionFactory 这个是配置连接信息,这里的RedisConnectionFactory是一个接 …...
python:洛伦兹变换
洛伦兹变换(Lorentz transformations)是相对论中的一个重要概念,特别是在讨论时空的变换时非常重要。在四维时空的背景下,洛伦兹变换描述了在不同惯性参考系之间如何变换时间和空间坐标。在狭义相对论中,洛伦兹变换通常…...
题单:插入排序
题目描述 给定 n 个元素的数组(下标从1开始计),请使用插入排序对其进行排序(升序)。 输入格式 两行,第一行为一个整数 n,表示元素的个数。 第二行 n 个空格分隔的整数,表示数组的…...
【Spring】Spring启示录
目录 前言 一、示例程序 二、OCP开闭原则 三、依赖倒置原则DIP 四、控制反转IOC 总结 前言 在软件开发的世界里,随着项目的增长和需求的变化,如何保持代码的灵活性、可维护性和扩展性成为了每个开发者必须面对的问题。传统的面向过程或基于类的设计…...
【Numpy核心编程攻略:Python数据处理、分析详解与科学计算】1.30 性能巅峰:NumPy代码优化全攻略
1.30 性能巅峰:NumPy代码优化全攻略 目录 #mermaid-svg-CMVXy3CN2tNmW8RJ {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CMVXy3CN2tNmW8RJ .error-icon{fill:#552222;}#mermaid-svg-CMVXy3CN2tNmW8RJ …...
C#方法(练习)
1.定义一个函数,输入三个值,找出三个数中的最小值 2.定义一个函数,输入三个值,找出三个数中的最大值 3.定义一个函数,输入三个值,找出三个数中的平均值 4.定义一个函数,计算一个数的 N 次方 Pow(2, 3)返回8 5.传入十一…...
Node.js 的底层原理
Node.js 的底层原理 1. 事件驱动和非阻塞 I/O Node.js 基于 Chrome V8 引擎,使用 JavaScript 作为开发语言。它采用事件驱动和非阻塞 I/O 模型,使其轻量且高效。通过 libuv 库实现跨平台的异步 I/O,包括文件操作、网络请求等。 2. 单线程事…...