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

Go 与 Gin 搭建简易 Postman:实现基础 HTTP 拨测的详细指南

Go 与 Gin 搭建简易 Postman:实现基础 HTTP 拨测的详细指南

文章目录

  • Go 与 Gin 搭建简易 Postman:实现基础 HTTP 拨测的详细指南
    • 项目简介
    • 代码结构
      • 各部分代码功能说明:
    • 代码实现:
      • main.go
        • 代码解释
      • handlers/probe.go
        • 代码解释
      • probe/types.go
        • 代码解释
      • probe/http.go
        • 代码解释:
      • index.html
        • 代码解释
      • style.css
        • 代码解释
    • 代码构建
      • 访问测试
    • 总结

项目简介

在日常的开发和测试工作中,我们经常需要对各种网络接口进行测试,以确保它们能够正常工作。Postman 是一款非常流行的工具,它可以帮助我们方便地发送 HTTP 请求并查看响应结果。本项目旨在实现一个简易的 Postman 工具,支持基本的 HTTP 拨测功能,用户可以通过该工具输入 URL 和请求方法,发送请求并查看响应的状态码和延迟时间。
在这里插入图片描述

代码结构

├── main.go          # 主程序入口
├── handlers         # HTTP处理器
│   └── probe.go
├── probe            # 拨测核心逻辑
│   ├── http.go
│   ├── types.go
├── static           # 前端静态文件
│   ├── index.html
│   └── style.css
└── go.mod

各部分代码功能说明:

  • main.go:作为主程序入口,负责初始化 Gin 框架,设置静态文件路由和 API 路由,并启动 HTTP 服务器。
  • handlers/probe.go:处理拨测请求,解析客户端发送的请求参数,根据协议类型调用相应的拨测函数,并返回拨测结果。
  • probe 目录:包含拨测的核心逻辑,其中 http.go 实现了 HTTP 协议的拨测功能,types.go 定义了统一的响应结构体和创建错误结果的工具函数。
  • static 目录:存放前端静态文件,index.html 是前端页面的主体,style.css 用于设置页面的样式。
  • go.mod:Go 模块文件,管理项目的依赖。

代码实现:

main.go

package mainimport ("github.com/gin-gonic/gin""time"
)type ProbeResult struct {Endpoint   string `json:"endpoint"`StatusCode int    `json:"status_code"`Duration   int64  `json:"duration"`
}func main() {r := gin.Default()// 静态文件路由r.Static("/static", "./static")r.GET("/", func(c *gin.Context) {c.File("./static/index.html")})// API路由r.POST("/api/probe", func(c *gin.Context) {// 模拟132ms延迟time.Sleep(132 * time.Microsecond)c.JSON(200, ProbeResult{Endpoint:   "http://192168.100.10:8080",StatusCode: 200,Duration:   132,})})r.Run(":8080")
}
代码解释
  • 导入 github.com/gin-gonic/gin 包用于构建 HTTP 服务器,time 包用于模拟延迟。
  • 定义 ProbeResult 结构体,用于存储拨测结果,包含端点、状态码和延迟时间。
  • main 函数中,初始化 Gin 引擎 r
  • 设置静态文件路由,将 /static 路径映射到 ./static 目录,以便前端页面可以访问静态资源。
  • 定义根路径 / 的处理函数,返回 ./static/index.html 文件。
  • 定义 /api/probe 的 POST 请求处理函数,模拟 132ms 的延迟,并返回一个示例拨测结果。
  • 最后启动服务器,监听 :8080 端口。

handlers/probe.go

package handlersimport ("net/http""strings""time""http/probe""github.com/gin-gonic/gin"
)type ProbeRequest struct {Protocol string `json:"protocol"`Method   string `json:"method"`URL      string `json:"url"`Timeout  int    `json:"timeout"`
}func ProbeHandler(c *gin.Context) {var req ProbeRequestif err := c.ShouldBindJSON(&req); err != nil {c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})return}// 自动补全协议头if !strings.Contains(req.URL, "://") {req.URL = "http://" + req.URL}start := time.Now()var result probe.ProbeResultswitch req.Protocol {case "HTTP":result = probe.HTTPProbe(req.Method, req.URL, req.Timeout)//case "TCP"://	result = probe.TCPProbe(req.URL, req.Timeout)//case "ICMP"://	result = probe.ICMPProbe(strings.Split(req.URL, "://")[1], 4)//case "SSL"://	result = probe.SSLProbe(req.URL, req.Timeout)default:c.JSON(http.StatusBadRequest, gin.H{"error": "不支持的协议类型"})return}result.Duration = time.Since(start).Milliseconds()c.JSON(http.StatusOK, result)
}
代码解释
  • 定义 ProbeRequest 结构体,用于接收客户端发送的拨测请求参数,包括协议类型、请求方法、URL 和超时时间。
  • ProbeHandler 函数是 /api/probe 接口的处理函数,首先尝试将客户端发送的 JSON 数据绑定到 ProbeRequest 结构体上,如果绑定失败则返回 400 错误。
  • 自动补全 URL 的协议头,如果 URL 中不包含 ://,则默认添加 http://
  • 记录开始时间,根据协议类型调用相应的拨测函数,目前只实现了 HTTP 协议的拨测。
  • 计算拨测的延迟时间,并将其赋值给 result.Duration
  • 最后返回拨测结果给客户端。

probe/types.go

package probe// 统一响应结构体(必须大写开头才能被外部访问)
type ProbeResult struct {Endpoint   string `json:"endpoint"`        // 探测地址StatusCode int    `json:"status_code"`     // HTTP状态码/探测状态Duration   int64  `json:"duration"`        // 延迟毫秒数Protocol   string `json:"protocol"`        // 协议类型Error      string `json:"error,omitempty"` // 错误信息
}// 创建错误结果的工具函数
func NewErrorResult(endpoint string, err error) ProbeResult {return ProbeResult{Endpoint:   endpoint,Error:      err.Error(),Protocol:   "Unknown",StatusCode: 500,}
}
代码解释
  • 定义 ProbeResult 结构体,作为统一的拨测响应结构体,包含探测地址、状态码、延迟时间、协议类型和错误信息。
  • NewErrorResult 函数是一个工具函数,用于创建一个包含错误信息的拨测结果。

probe/http.go

package probeimport ("net/http""strings""time"
)func HTTPProbe(target string) ProbeResult {start := time.Now()// 自动补全协议头if !strings.HasPrefix(target, "http") {target = "http://" + target}// 真实网络请求client := &http.Client{Timeout: 10 * time.Second}resp, err := client.Get(target)duration := time.Since(start).Milliseconds()result := ProbeResult{Endpoint: target,Duration: duration,}if err != nil {result.Error = err.Error()return result}defer resp.Body.Close()result.StatusCode = resp.StatusCodereturn result
}
代码解释:
  • HTTPProbe 函数实现了 HTTP 协议的拨测功能。
  • 记录开始时间,自动补全 URL 的协议头。
  • 创建一个 http.Client 对象,设置超时时间为 10 秒,然后发送 GET 请求。
  • 计算请求的延迟时间,并将其赋值给 result.Duration
  • 如果请求过程中出现错误,将错误信息赋值给 result.Error 并返回结果。
  • 如果请求成功,获取响应的状态码并赋值给 result.StatusCode,最后返回结果。

index.html

<!DOCTYPE html>
<html>
<head><title>是垚不是土的网络拨测工具</title><style>/* 精确还原图片样式 */body {background: #f0f2f5;font-family: Arial;margin: 0;padding: 20px;}.container {background: white;border-radius: 8px;padding: 20px;max-width: 800px;margin: 0 auto;box-shadow: 0 1px 3px rgba(0,0,0,0.12); /* 添加阴影效果 */}.tabs button {padding: 10px 24px; /* 精确匹配按钮尺寸 */border: none;background: none;cursor: pointer;border-bottom: 2px solid transparent;font-size: 14px;color: #666;}.tabs button.active {border-color: #1890ff;color: #1890ff;font-weight: bold;}.input-group {display: flex;gap: 10px;margin: 24px 0; /* 调整间距 */align-items: center;}#method {width: 100px;padding: 8px 12px;border: 1px solid #d9d9d9;border-radius: 4px;font-size: 14px;}#url {flex: 1;padding: 8px 12px;border: 1px solid #d9d9d9;border-radius: 4px;font-family: monospace; /* 代码字体 */}#probe-btn {background: #1890ff;color: white;border: none;padding: 8px 24px;border-radius: 4px;cursor: pointer;transition: opacity 0.2s;}#probe-btn:hover {opacity: 0.9;}table {width: 100%;border-collapse: collapse;margin-top: 24px;}th, td {padding: 14px 16px; /* 调整单元格间距 */border: 1px solid #e8e8e8;text-align: left;font-size: 14px;}th {background: #fafafa;font-weight: 500;}.status-code {font-family: monospace;}.status-ok {color: #52c41a; /* 精确匹配绿色 */font-weight: 500;}.status-error {color: #ff4d4f; /* 新增错误颜色 */font-weight: 500;}</style>
</head>
<body>
<div class="container"><div class="tabs"><button class="active">HTTP</button><button>ICMP</button><button>TCP</button><button>SSL</button></div><div class="input-group"><select id="method"><option>GET</option><option>POST</option></select><input type="text" id="url" placeholder="http://192.168.100.10:8080"><button id="probe-btn">拨测一下</button></div><div class="advanced">> 高级选项</div><table><thead><tr><th>端点</th><th>状态码</th><th>响应延迟</th></tr></thead><tbody id="results"><!-- 初始示例数据 --><tr><td>http://192.168.100.10:8080</td><td class="status-ok">200</td><td>132ms</td></tr><tr><td>http://192.168.100.10:80</td><td class="status-error">404</td><td>0ms</td></tr></tbody></table>
</div><script>document.getElementById('probe-btn').addEventListener('click', async () => {const url = document.getElementById('url').value;// 输入验证if (!url) {alert('请输入要拨测的URL地址');return;}try {// 发送拨测请求const response = await fetch('/api/probe', {method: 'POST',headers: {'Content-Type': 'application/json'},body: JSON.stringify({protocol: 'HTTP',method: document.getElementById('method').value,url: url})});if (!response.ok) throw new Error('网络请求失败');const data = await response.json();// 创建新结果行const newRow = document.createElement('tr');newRow.innerHTML = `<td>${data.endpoint}</td><td class="${data.status_code === 200 ? 'status-ok' : 'status-error'}">${data.status_code}</td><td>${data.duration}ms</td>`;// 插入到表格顶部const tbody = document.getElementById('results');tbody.insertBefore(newRow, tbody.firstChild);} catch (error) {// 错误处理const errorRow = document.createElement('tr');errorRow.innerHTML = `<td>${url}</td><td class="status-error">ERROR</td><td>0ms</td>`;document.getElementById('results').prepend(errorRow);}});
</script>
</body>
</html>
代码解释
  • 前端页面使用 HTML、CSS 和 JavaScript 实现。
  • CSS 部分设置了页面的样式,包括背景颜色、字体、按钮样式、表格样式等。
  • HTML 部分构建了页面的结构,包括选项卡、输入框、拨测按钮和结果表格。
  • JavaScript 部分实现了拨测按钮的点击事件处理逻辑:
    • 首先进行输入验证,如果用户没有输入 URL,则弹出提示框。
    • 使用 fetch API 发送 POST 请求到 /api/probe 接口,携带协议类型、请求方法和 URL 信息。
    • 如果请求成功,将响应数据解析为 JSON 格式,并创建一个新的表格行,将拨测结果显示在表格顶部。
    • 如果请求失败,创建一个包含错误信息的表格行,并显示在表格顶部。

style.css

body {font-family: Arial, sans-serif;margin: 20px;background: #f0f2f5;
}.container {background: white;border-radius: 8px;padding: 20px;max-width: 800px;margin: 0 auto;
}.tabs button {padding: 10px 20px;border: none;background: none;border-bottom: 2px solid transparent;cursor: pointer;
}.tabs button.active {border-color: #1890ff;color: #1890ff;font-weight: bold;
}.input-group {display: flex;gap: 10px;margin: 20px 0;align-items: center;
}#url {flex: 1;padding: 8px 12px;border: 1px solid #d9d9d9;border-radius: 4px;
}button {background: #1890ff;color: white;border: none;padding: 8px 20px;border-radius: 4px;cursor: pointer;
}table {width: 100%;border-collapse: collapse;margin-top: 20px;
}th, td {padding: 12px;border: 1px solid #e8e8e8;text-align: left;
}.status-200 {color: #52c41a;font-weight: 500;
}.status-error {color: #ff4d4f;font-weight: 500;
}
代码解释
  • style.css 文件用于设置页面的全局样式,包括背景颜色、字体、按钮样式、表格样式等。

代码构建

go.mod

module httpgo 1.23.0toolchain go1.23.8require (github.com/gin-gonic/gin v1.10.0github.com/go-ping/ping v1.2.0golang.org/x/net v0.40.0
)require (github.com/bytedance/sonic v1.13.2 // indirectgithub.com/bytedance/sonic/loader v0.2.4 // indirectgithub.com/cloudwego/base64x v0.1.5 // indirectgithub.com/cloudwego/iasm v0.2.0 // indirectgithub.com/gabriel-vasile/mimetype v1.4.9 // indirectgithub.com/gin-contrib/sse v1.1.0 // indirectgithub.com/go-playground/locales v0.14.1 // indirectgithub.com/go-playground/universal-translator v0.18.1 // indirectgithub.com/go-playground/validator/v10 v10.26.0 // indirectgithub.com/goccy/go-json v0.10.5 // indirectgithub.com/google/uuid v1.6.0 // indirectgithub.com/json-iterator/go v1.1.12 // indirectgithub.com/klauspost/cpuid/v2 v2.2.10 // indirectgithub.com/leodido/go-urn v1.4.0 // indirectgithub.com/mattn/go-isatty v0.0.20 // indirectgithub.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirectgithub.com/modern-go/reflect2 v1.0.2 // indirectgithub.com/pelletier/go-toml/v2 v2.2.4 // indirectgithub.com/twitchyliquid64/golang-asm v0.15.1 // indirectgithub.com/ugorji/go/codec v1.2.12 // indirectgolang.org/x/arch v0.17.0 // indirectgolang.org/x/crypto v0.38.0 // indirectgolang.org/x/sync v0.14.0 // indirectgolang.org/x/sys v0.33.0 // indirectgolang.org/x/text v0.25.0 // indirectgoogle.golang.org/protobuf v1.36.6 // indirectgopkg.in/yaml.v3 v3.0.1 // indirect
)

安装依赖

go mod tidy

go mod tidy 命令会自动下载项目所需的依赖包,并更新 go.modgo.sum 文件。

运行程序:

go run main.go

访问测试

http://localhost:8080

在这里插入图片描述

打开浏览器,访问 http://localhost:8080,即可看到简易 Postman 工具的界面。在输入框中输入要拨测的 URL 和请求方法,点击 “拨测一下” 按钮,即可发送请求并查看响应的状态码和延迟时间。

总结

通过本项目,我们实现了一个简易的 Postman 工具,支持基本的 HTTP 拨测功能。项目采用了前后端分离的架构,前端使用 HTML、CSS 和 JavaScript 实现用户界面,后端使用 Go 语言和 Gin 框架实现 HTTP 服务器和拨测逻辑。在实际开发中,我们可以进一步扩展该工具,支持更多的协议类型(如 TCP、ICMP、SSL 等),添加更多的请求参数(如请求头、请求体等),以及优化用户界面和错误处理逻辑。

相关文章:

Go 与 Gin 搭建简易 Postman:实现基础 HTTP 拨测的详细指南

Go 与 Gin 搭建简易 Postman&#xff1a;实现基础 HTTP 拨测的详细指南 文章目录 Go 与 Gin 搭建简易 Postman&#xff1a;实现基础 HTTP 拨测的详细指南项目简介代码结构各部分代码功能说明&#xff1a; 代码实现&#xff1a;main.go代码解释 handlers/probe.go代码解释 probe…...

层次原理图

层次原理图简介 层次原理图&#xff08;Hierarchical Schematic&#xff09;是一种常用于电子工程与系统设计的可视化工具&#xff0c;通过分层结构将复杂系统分解为多个可管理的子模块。它如同“设计蓝图”&#xff0c;以树状结构呈现整体与局部的关系&#xff1a;顶层展现系…...

嵌入式硬件篇---拓展板

文章目录 前言 前言 本文简单介绍了拓展板的原理以及使用。...

Redis的主从架构

主从模式 全量同步 首先主从同步过程第一步 会先比较replication id 判断是否是第一次同步假设为第一次同步 那么就会 启动bgsave异步生成RDB 同时fork子进程记录生成期间的新数据发送RDB给从节点 清空本地数据写入RDB 增量同步 对比ReplicationID不同因此选择增量同步在Rep…...

IIS入门指南:原理、部署与实战

引言&#xff1a;Web服务的基石 在Windows Server机房中&#xff0c;超过35%的企业级网站运行在IIS&#xff08;Internet Information Services&#xff09;之上。作为微软生态的核心Web服务器&#xff0c;IIS不仅支撑着ASP.NET应用的运行&#xff0c;更是Windows Server系统管…...

【上位机——WPF】布局控件

布局控件 常用布局控件Panel基类Grid(网格)UniformGrid(均匀分布)StackPanel(堆积面板)WrapPanel(换行面板)DockerPanel(停靠面板)Canvas(画布布局)Border(边框)GridSplitter(分割窗口)常用布局控件 Grid:网格,根据自定义行和列来设置控件的布局StackPanel:栈式面板,包含的…...

使用 C# 入门深度学习:线性代数详细讲解

在深度学习的领域中&#xff0c;线性代数是基础数学工具之一。无论是神经网络的训练过程&#xff0c;还是数据的预处理和特征提取&#xff0c;线性代数的知识都无处不在。掌握线性代数的核心概念&#xff0c;对于理解和实现深度学习算法至关重要。在本篇文章中&#xff0c;我们…...

操作系统之EXT文件系统

1.理解硬件 1.1磁盘、服务器、机柜、机房 机械磁盘是计算机中唯一的一个机械设备 磁盘--- 外设慢容量大&#xff0c;价格便宜 1.1.1光盘 1.1.2服务器 1.1.3机房 1.2磁盘的物理结构 1.3磁盘的存储结构 一个盘片又两个面 每个面都有一个磁头 磁头沿着盘面的半径移动 1.3.1…...

继MCP、A2A之上的“AG-UI”协议横空出世,人机交互迈入新纪元

第一章&#xff1a;AI交互的进化与挑战 1.1 从命令行到智能交互 人工智能的发展历程中&#xff0c;人机交互的方式经历了多次变革。早期的AI系统依赖命令行输入&#xff0c;用户需通过特定指令与机器沟通。随着自然语言处理技术的进步&#xff0c;语音助手和聊天机器人逐渐普…...

Java大厂面试:从Web框架到微服务技术的场景化提问与解析

Java大厂面试&#xff1a;从Web框架到微服务技术的场景化提问与解析 场景&#xff1a; 某知名互联网大厂的面试现场。面试官一脸严肃&#xff0c;对面坐着搞笑的程序员谢飞机。以下是他们的对话&#xff1a; 第一轮&#xff1a;Web框架基础与数据库操作 面试官&#xff1a;谢…...

最新缺陷检测模型:EPSC-YOLO(YOLOV9改进)

目录 引言:工业缺陷检测的挑战与突破 一、EPSC-YOLO整体架构解析 二、核心模块技术解析 1. EMA多尺度注意力模块:让模型"看得更全面" 2. PyConv金字塔卷积:多尺度特征提取利器 3. CISBA模块:通道-空间注意力再进化 4. Soft-NMS:更智能的重叠框处理 三、实…...

leetcode hot100刷题日记——2.字母异位词分组

涉及知识点:vector、哈希表 解答我的解答的时间复杂度分析我的解答的空间复杂度分析复习&#xff1a;排序算法的时间复杂度 和第一题需要的知识点相同&#xff0c;所以知识点复习可见 link1《leetcode hot100刷题日记——1.两数之和》 解题思路&#xff1a;是字母异位词的字符…...

elementUI 单选框存在多个互斥的选项中选择的场景

使用 el-radio-group 来使用单选框组&#xff0c;代码如下&#xff1a; <el-radio-group input"valueChangeHandler" v-model"featureForm.type"><el-radio name"feature" label"feature">业务对象</el-radio><…...

基于区块链技术的智能汽车诊断与性能分析

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 钝感力的“钝”&#xff0c;不是木讷、迟钝&#xff0c;而是直面困境的韧劲和耐力&#xff0c;是面对外界…...

基于区块链技术的供应链溯源系统:重塑信任与透明度

在当今全球化的商业环境中&#xff0c;供应链的复杂性不断增加&#xff0c;产品从原材料采购到最终交付消费者手中的过程涉及多个环节和众多参与者。然而&#xff0c;传统供应链管理面临着诸多挑战&#xff0c;如信息不透明、数据易篡改、追溯困难等&#xff0c;这些挑战不仅影…...

基于OpenCV的实时文档扫描与矫正技术

文章目录 引言一、系统概述二、核心代码解析1. 导入必要库2. 辅助函数定义3. 坐标点排序函数4. 透视变换函数5. 主程序流程 三、完整代码四、结语 引言 在日常工作和学习中&#xff0c;我们经常需要将纸质文档数字化。手动拍摄文档照片常常会出现角度倾斜、透视变形等问题&…...

基于STM32F103与Marvell88W8686的WIFI无线监控视频传输系统研发(论文)

基于STM32F103与Marvell88W8686的WIFI无线监控视频传输系统研发 中文摘要 在当今社会信息化进程不断加速的时代背景下&#xff0c;众多领域对于监控系统的需求日益增长&#xff0c;像车内安全监控、电梯运行监控等场景都离不开监控系统的支持。过去&#xff0c;不少领域普遍采用…...

华为云Astro中各种变量与参数的区别与用法

目录 🧠 华为云 Astro 各类变量与参数详解 🧩 一、变量与参数的核心作用是什么? 🖼️ 二、整体分类与结构图 📘 三、逐一详细解析 + 类比说明 + 使用建议 🔹 1. 输入参数(Input Parameter) 🔹 2. 输出参数(Output Parameter) 🔹 3. 变量(本地变量)…...

数字人技术的核心:AI与动作捕捉的双引擎驱动(210)

**摘要&#xff1a;**数字人技术从静态建模迈向动态交互&#xff0c;AI与动作捕捉技术的深度融合推动其智能化发展。尽管面临表情僵硬、动作脱节、交互机械等技术瓶颈&#xff0c;但通过多模态融合技术、轻量化动捕方案等创新&#xff0c;数字人正逐步实现自然交互与情感表达。…...

华为云Astro轻应用创建业务对象(BO)的概念梳理

目录 一、业务对象(BO)是什么?——【详细概念解释】 二、形象理解业务对象(BO) 🍱 类比方式: 📦 举个具体例子:以做一个“智能烟雾报警系统”应用 三、为什么使用BO很重要? 四、小结: 一、业务对象(BO)是什么?——【详细概念解释】 在华为云Astro轻应用…...

MySQL开发规范

目录 一、建表规约 二、索引规约 三、SQL语句 四、 ORM映射 一、建表规约 强制&#xff1a; 1、表达是与否概念的字段&#xff0c;必须使用is_xxx的方式命名&#xff08;PoJo中不加is前缀&#xff09;&#xff0c;数据类型是unsigned tinyint&#xff08;1表示是&#xf…...

K8s入门教程(一)

Kubernetes(K8s)入门教程:从零开始掌握容器编排 目录 Kubernetes(K8s)入门教程:从零开始掌握容器编排 1. Kubernetes 简介 1.1 什么是 Kubernetes? 1.2 核心功能 2. 环境搭建与 Minikube 安装 2.1 安装 Minikube 安装步骤(以 macOS 为例): 安装 kubectl(Kub…...

k8s备份namespace

在 Kubernetes 中备份 Namespace 有多种方法&#xff0c;以下是几种常见的备份方式&#xff1a; 1.使用 kubectl 命令备份 通过 kubectl 命令可以导出指定 Namespace 中的资源&#xff0c;生成 YAML 文件进行备份。 备份所有资源&#xff1a; kubectl -n <namespace> ge…...

前端动画库 Anime.js 的V4 版本,兼容 Vue、React

前端动画库 Anime.js 更新了 V4 版本&#xff0c;并对其官网进行了全面更新&#xff0c;增加了许多令人惊艳的效果&#xff0c;尤其是时间轴动画效果&#xff0c;让开发者可以更精确地控制动画节奏。 这一版本的发布不仅带来了全新的模块化 API 和显著的性能提升&#xff0c;还…...

OpenHarmony外设驱动使用 (四),Face_auth

OpenHarmony外设驱动使用 &#xff08;四&#xff09; Face_auth 概述 功能简介 人脸识别功能是端侧设备不可或缺的一部分&#xff0c;为设备提供一种用户认证能力&#xff0c;可应用于设备解锁、支付、应用登录等身份认证场景。它是基于人的脸部特征信息进行身份识别的一种…...

【Java ee初阶】jvm(1)

一、JVM Java虚拟机 面试中相关的问题有三块&#xff1a; 1.JVM内存区域划分 2.JVM的类加载机制 3.JVM的垃圾回收机制 JDK、JRE 和 JVM 的关系 JDK&#xff08;Java Development Kit&#xff09;是 Java 开发工具包&#xff0c;包含了编写、编译和调试 Java 程序所需的所…...

【Java ee初阶】jvm(2)

类加载机制&#xff1a; JVM从最开始的读取.class文件&#xff0c;到最终构造完成 类 对象的整个过程&#xff0c;也就是把 类 从硬盘 加载到内存中的机制。 Java的类加载机制主要分为五个步骤&#xff1a;加载、验证、准备、解析和初始化。 步骤一 加载&#xff08;Loading…...

Django 项目创建全攻略

目录 一、环境准备​ 1. 安装 Python​ 2. 安装虚拟环境&#xff08;可选但推荐&#xff09;​ 3. 安装 Django​ 二、创建 Django 项目​ 1. 使用命令创建项目​ 2. 运行开发服务器​ 三、创建 Django 应用​ 1. 创建应用​ 2. 注册应用​ 四、配置项目​ 1. 数据…...

windows11 安装好后右键没有 git bash 命令

win键 R 键&#xff0c;输出 regedit&#xff0c;打开注册表 找到 \HKEY_CLASSES_ROOT\Directory\Background\shell 新建项 git-bash 然后在 git-bash 下在新建项 Command&#xff0c;默认值设为 "C:\Program Files\Git\git-bash.exe" --cd"%v." 在 …...

Java八股文——Java基础篇

目录 1、你是怎样理解OOP面向对象2、重载和重写的区别3、接口与抽象类的区别4、深拷贝与浅拷贝的理解5、sleep和wait区别主要区别 6、什么是自动拆装箱&#xff0c;int和Integer有什么区别自动拆装箱int和Integer的区别Integer缓存机制 7、和equals区别String特殊情况 8、Strin…...

蓝桥杯19682 完全背包

问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi​&#xff0c;价值为 wi​。每件物品可以使用无限次。 请问可以通过什么样的方式选择物品&#xff0c;使得物品总体积不超过 M 的情况下总价值最大&#xff0c;输出这个最大价值即可。 输入格式 第一行…...

2025年- H27-Lc135- 239.滑动窗口最大值(自定义双端队列)---java版

1.题目描述 2.思路 &#xff08;1&#xff09;双端队列可以移除最左边的元素&#xff0c;也可以移除最右边的元素&#xff08;两端移除&#xff09; &#xff08;2&#xff09;在最右边插入元素&#xff08;右边加入&#xff09; &#xff08;3&#xff09;队列单调性&#xf…...

EKS 工作节点的集群网络架构

AWS EKS&#xff08;弹性 Kubernetes 服务&#xff09;是亚马逊提供的托管 Kubernetes 服务&#xff0c;一旦配置完成&#xff0c;即可像变魔术一样运行。但这通常是 EKS 的默认设置。如果您打算根据组织的设计、合规性标准和隐私要求进行自定义&#xff0c;该怎么办&#xff1…...

【技海登峰】Kafka漫谈系列(十一)SpringBoot整合Kafka之消费者Consumer

【技海登峰】Kafka漫谈系列(十一)SpringBoot整合Kafka之消费者Consumer spring-kafka官方文档: https://docs.spring.io/spring-kafka/docs/2.8.10/reference/pdf/spring-kafka-reference.pdf KafkaTemplate API: https://docs.spring.io/spring-kafka/api/org/springframe…...

Python字符串格式化(一):三种经典格式化方法

文章目录 一、% operator&#xff1a;C语言风格的初代格式化方案&#xff08;Python 2.0引入&#xff09;1. 语法核心&#xff1a;占位符与类型码2. 进阶用法&#xff1a;格式修饰符3. 致命缺陷&#xff1a;类型严格匹配的陷阱4. 适用场景&#xff1a;旧代码维护的兼容性选择 二…...

浅谈无服务器WebSocket的优势

实际上&#xff0c;一个实用的解决方案是将构建业务关键型实时平台的复杂性卸载到专门的云服务中。 完全托管的无服务器 WebSocket 解决方案为事件驱动的消息传递提供了基础结构;它使底层基础设施成为一种商品。客户端使用提供程序服务发送/接收低延迟消息&#xff0c;并专注于…...

10.7 LangChain v0.3架构大升级:模块化设计+多阶段混合检索,开发效率飙升3倍!

LangChain v0.3 技术生态与未来发展 关键词:LangChain Chains, Agents 架构, Retrieval Strategy, LangGraph, 模块化设计 3. LangChain 项目:Chains, Agents, Retrieval Strategy LangChain v0.3 通过 Chains-Agents-Retrieval 三位一体的技术栈,构建起完整的大模型应用开…...

GLPK(GNU线性规划工具包)中建模语言MathProg的使用

GNU MathProg是一种用于描述线性数学规划模型的建模语言。用GNU MathProg语言编写的模型描述由一组语句和数据块组成。 在MathProg中&#xff0c;模型以集合、参数、变量、约束和目标(sets, parameters, variables, constraints, objectives称为模型对象)的形式进行描述。 在Ma…...

系统思考:IT企业项目困境分析

最近遇到一家快速发展的IT技术公司&#xff0c;遭遇了项目进度滞后、团队沟通不畅和资源分配不合理等一系列挑战。虽然他们拥有一支技术强大的团队&#xff0c;但在项目管理和团队协作上却显得力不从心。结果&#xff0c;多个项目超预算、交期延迟&#xff0c;客户满意度直线下…...

计算机网络 - 2.基础协议

1.TCP协议 1.TCP(Transmission Control Protocol):传输控制协议2.TCP协议是一种面向连接的、可靠的、 基于字节流的传输层通信协议 1.面向连接:两个使用TCP协议的应用(通常一个客户和一个服务器)在彼此交换数据包之前必须先建立一个TCP连接2.可靠的 1.数据传输之前都要建立…...

go语法大赏

前些日子单机房稳定性下降&#xff0c;找了好一会才找到真正的原因。这里面涉及到不少go语法细节&#xff0c;正好大家一起看一下。 一、仿真代码 这是仿真之后的代码 package mainimport ("fmt""go.uber.org/atomic""time" )type StopSignal…...

运行vscode编辑器源码

距离上次二次开发vscode已经是三年前的事了&#xff0c;当时是1.60.0版本&#xff0c;目前vscode已升级到了1.99.2版本&#xff0c;里面改动很大&#xff0c;最近下载下来了新版源码跑起来看看 准备node、python 源码里面node版本做了限制 2025-01-27 09:53:00.450 [info] Fo…...

ShenNiusModularity项目源码学习(26:ShenNius.Admin.Mvc项目分析-11)

本文学习并分析ShenNiusModularity项目中商城系统模块的小程序用户页面、用户收货地址页面。 1、小程序用户页面 小程序用户页面用于检索、浏览使用商城系统的用户数据&#xff08;保存在shop_appuser表内&#xff0c;系统用户保存在sys_user表内&#xff09;&#xff0c;该页…...

C#中的成员常量:编译时的静态魔法

在C#编程中&#xff0c;常量(const)是一个强大而特殊的语言特性&#xff0c;特别是当它们作为类的成员时。本文将深入探讨成员常量的特性、使用场景以及与静态量的区别。 成员常量的基本特性 成员常量是声明在类内部的常量&#xff0c;具有以下核心特点&#xff1a; 声明位置…...

C# 深入理解类(成员常量)

成员常量 成员常量类似前一章所述的局部常量&#xff0c;只是它们被声明在类声明中而不是方法内&#xff0c;如下面的 示例&#xff1a; 与局部常量类似&#xff0c;用于初始化成员肯量的值在编译时必须是可计算的&#xff0c;而且通常是一个预定 义简单类型或由它们组成的表达…...

服务端HttpServletRequest、HttpServletResponse、HttpSession

一、概述 在JavaWeb 开发中&#xff0c;获取客户端传递的参数至关重要。http请求是客户端向服务端发起数据传输协议&#xff0c;主要包含包含请求行、请求头、空行和请求体四个部分&#xff0c;在这四部分中分别携带客户端传递到服务端的数据。常见的http请求方式有get、post、…...

有哪些GIF图片转换的开源工具

以下是关于GIF图片转换的开源工具的详细总结,涵盖功能特点、适用场景及用户评价: 1. FFmpeg 功能特点: 作为开源命令行工具,FFmpeg支持视频转GIF、调整帧率、分辨率、截取片段等操作,可通过脚本批量处理。适用场景: 适合开发者或技术用户进行高效批处理,常用于服务器端自…...

Vue.js教学第五章:计算属性与侦听器详解

Vue.js 之计算属性与侦听器详解 一、计算属性 (一)概念 计算属性(Computed Properties)是 Vue.js 中的一个核心概念。它允许我们基于一个或多个数据属性来定义一个新的属性,该属性的值会根据其依赖的数据属性的变化而自动更新。这就好像是一个 “智能” 属性,它的值不是…...

第三章:UI 系统架构拆解与动态界面管理实录

还记得我们第二章刚跑通主场景&#xff0c;那时候是不是觉得“终于见到界面了”&#xff1f;但请等等&#xff0c;你看到的只是冰山一角&#xff0c;下面藏着的是 UIManager 的地狱之门。 本章我们将深入探讨&#xff1a; UI 界面如何加载&#xff08;Prefab 动态加载机制&…...

第四章:WebSocket 通信机制全解与客户端发包实录

如果你以为一个游戏启动后只靠本地逻辑运转&#xff0c;那你真是低估了网络通信的存在感。在互动组件项目里&#xff0c;WebSocket 才是真正的灵魂通道——UI 再好看&#xff0c;没包发出去也等于白搭。 本章我们深入讲解 WebSocket 在安卓前端项目中的应用&#xff0c;从封装结…...