Go:测试
go test 工具
go test
是 Go 语言包的测试驱动程序 ,包依据特定约定组织 。包目录中以_test.go
结尾的文件是go test
编译对象,而非go build
的编译目标 。
特殊测试函数
在*_test.go
文件中有三种特殊函数 :
- 功能测试函数:以
Test
为前缀命名 ,用于检测程序逻辑正确性 ,go test
运行后报告测试结果为PASS
(通过)或FAIL
(失败 )。 - 基准测试函数:名称以
Benchmark
开头 ,用于测试某些操作性能 ,go test
会汇报操作的平均执行时间 。 - 示例函数:名称以
Example
开头 ,提供经机器检查的文档 。后续 11.2 节、11.4 节、11.6 节将分别详述这三种函数。
工作流程
go test
工具扫描*_test.go
文件查找上述特殊函数 ,生成临时main
包调用它们 ,接着进行编译、运行并汇报结果 ,最后清空临时文件 。
Test 函数
func TestName(t *testing.T) {//...
}
测试文件需导入testing
包 。功能测试函数以Test
为前缀,可选后缀以大写字母开头,函数签名为func TestName(t *testing.T)
,参数t
用于汇报测试失败和记录日志 。
package word
func IsPalindrome(s string) bool {for i := range s {if s[i]!= s[len(s)-1-i] {return false}}return true
}package word_test
import "testing"
func TestPalindrome(t *testing.T) {if!IsPalindrome("detartrated") {t.Error(`IsPalindrome("detartrated") = false`)}if!IsPalindrome("kayak") {t.Error(`IsPalindrome("kayak") = false`)}
}
func TestNonPalindrome(t *testing.T) {if IsPalindrome("palindrome") {t.Error(`IsPalindrome("palindrome") = true`)}
}
IsPalindrome
函数用于判断字符串是否为回文 。在word_test.go
文件中,有TestPalindrome
和TestNonPalindrome
两个测试函数,分别检查IsPalindrome
对回文和非回文输入的判断是否正确,通过t.Error
报告错误 。
测试运行与反馈
go test
(或go build
)在不指定包参数时,以当前目录所在包为参数 。运行测试命令后,可得到测试结果,如测试通过显示ok
及耗时;测试失败会给出具体错误信息,像新增TestFrenchPalindrome
和TestCanalPalindrome
测试函数后,因IsPalindrome
函数存在问题导致测试失败 。
测试选项
-v
选项:可输出包中每个测试用例的名称和执行时间,便于详细了解测试过程 。-run
选项:参数为正则表达式,能让go test
只运行函数名称匹配给定模式的测试函数 。
随机测试
基于表的测试针对精心挑选的输入检测函数,而随机测试通过构建随机输入扩展测试覆盖范围 。
随机测试策略
- 低效算法对比:额外编写一个使用低效但清晰算法的函数,对比两种实现的输出是否一致 。
- 模式构建输入:构建符合特定模式的输入,从而预知对应输出 。
注意事项
随机测试具有不确定性,测试用例失败时要记录足够信息以便重现问题 。对于复杂输入函数,记录伪随机数生成器种子比存储整个输入数据结构更简便 。使用当前时间作种子源,在自动化系统周期性运行测试时,每次运行都会得到新输入 。
测试命令
go test
工具不仅用于测试库代码包,也可测试命令 。包名main
一般生成可执行文件,但也能当作库导入进行测试 。
测试代码编写
package mainimport ("bytes""fmt""testing"
)func TestEcho(t *testing.T) {var tests = []struct {newline boolsep stringargs []stringwant string}{{true, "", []string{}, "\n"},{false, "", []string{}, ""},{true, "\t", []string{"one", "two", "three"}, "one\ttwo\tthree\n"},{true, ",", []string{"a", "b", "c"}, "a,b,c\n"},{false, ":", []string{"1", "2", "3"}, "1:2:3"},}for _, test := range tests {descr := fmt.Sprintf("echo(%v, %q, %q)",test.newline, test.sep, test.args)out = new(bytes.Buffer) // 捕获的输出if err := echo(test.newline, test.sep, test.args); err!= nil {t.Errorf("%s failed: %v", descr, err)continue}got := out.(*bytes.Buffer).String()if got!= test.want {t.Errorf("%s = %q, want %q", descr, got, test.want)}}
}
在echo_test.go
中编写测试代码 :
- 导入相关包(
bytes
、fmt
、testing
),定义TestEcho
测试函数 。 - 使用结构体数组
tests
组织测试用例,每个用例包含newline
、sep
、args
、want
(预期输出 )字段 。 - 遍历测试用例,为每个用例创建
bytes.Buffer
捕获输出,调用echo
函数,若有错误用t.Errorf
报告;若无错,对比实际输出与预期输出,不一致时也用t.Errorf
报告 。
注意事项
- 测试代码和产品代码在同一包(
main
包 )中,测试时该包当作库,TestEcho
函数被测试驱动程序调用,main
函数被忽略 。 - 可通过添加测试用例扩展测试,文中展示添加错误预期结果的用例及测试失败输出 。
- 测试代码中避免调用
log.Fatal
和os.Exit
,以免阻止跟踪过程,预期错误应通过返回非空error
值报告 。
白盒测试
测试分类可依据对测试包内部了解程度。黑盒测试仅通过公开 API 和文档了解包,包内部逻辑不透明;白盒测试可访问包内部函数和数据结构,进行常规用户无法做到的观察和改动,如检查数据类型不可变性维护情况 。二者互补,黑盒测试健壮,程序更新后基本无需修改,能发现 API 设计缺陷;白盒测试可对实现特定之处作更详细覆盖测试 。
- 以
TestIsPalindrome
函数为例,仅调用导出的IsPalindrome
函数,属于黑盒测试 。 TestEcho
函数调用未导出的echo
函数并更新未导出的全局变量out
,属于白盒测试 。
外部测试包
以net/url
和net/http
包为例,net/http
依赖net/url
,若在net/url
包内声明测试函数,可能导致包循环引用(Go 规范禁止 ) 。为解决此问题,引入外部测试包 。在net/url
目录下,有url_test
包声明的文件,后缀_test
让go test
单独编译该包并运行测试 。外部测试包无法通过常规路径导入 。
外部测试在单独包中,可引用依赖被测包的帮助包,这是包内测试无法做到的 。从设计层次看,外部测试包在其依赖的包之上,能更自由地导入其他包进行测试,尤其适合集成测试 。
go list
工具:可汇总包目录中的文件类型 。- 特殊文件:有时外部测试包需特殊访问权限避免循环引用,会在包内测试文件(
_test.go
)添加函数声明,将包内部功能暴露给外部测试 ,仅为此目的且无自身测试的源文件一般叫export_test.go
。 。
编写有效测试
Go 测试框架极简,与其他语言测试框架不同 。其他语言框架借助反射或元数据识别测试函数,有测试 “启动” 和 “销毁” 钩子,提供断言、值比较、错误消息格式化等工具方法库 ,虽能让测试编写精细,但结果像用其他语言编写测试,且错误消息可能模糊、维护不友好 。
Go 期望测试编写者像编写普通程序一样,通过定义函数避免重复 。测试不是机械填表,测试过程要有良好用户界面(维护者即用户 ) 。好的测试在出错时不崩溃,能输出简洁清晰的现象描述及相关信息,助维护者定位问题;不应在首次失败时终止,而应尝试报告多个错误,从错误发生方式挖掘原因 。
避免脆弱的测试
如果程序在遇到新合法输入时常崩溃,说明程序有缺陷;若测试用例在程序可靠改动时奇怪失败,那么该测试用例是脆弱的 。最脆弱的测试在产品代码稍有改动(无论好坏 )就失败,这类测试被称为变化探测器或现状探测器 ,处理它们耗费的时间会抵消其带来的好处 。
当被测函数输出复杂(如长字符串、详细数据结构、文件等 )时,若在测试中检查输出完全匹配预期的 “幸运值” ,随着程序演进,输出内容或输入可能改变,导致测试失败 。比如输出部分内容可能向好改变,但因与测试预期不符而使测试不通过;复杂输入的函数也可能因测试输入不再合法而崩溃 。
避免脆弱测试的关键是仅检查关心的属性 。先测试程序中简单稳定的接口,再测内部函数 。设置断言时要有选择性,例如不追求字符串精确匹配,而是寻找程序进化中不变的子串 。还可编写稳定函数从复杂输出提取核心内容,使断言更可靠 。虽然前期需投入精力,但可减少修复奇怪失败测试的时间消耗。
覆盖率
测试旨在发现 bug 而非证明其不存在,再多测试也无法证明包无 bug ,但测试可增强对包在多种场景下可用的信心 。测试套件覆盖待测包的比例即测试覆盖率 ,它无法精确测量,因程序动态性,微小程序也难精准衡量,但可辅助将测试精力集中在关键处 。语句覆盖率是常用的简单方法,指部分语句在一次执行中至少执行一次 。
go test
相关命令:检测测试可通过$ go test -v -run=Coverage gopl.io/ch7/eval
,加上-coverprofile=c.out
标记运行测试,可启用覆盖数据收集,修改源代码副本,在语句块执行前设置布尔变量,执行结束将变量值写入c.out
日志文件并输出执行语句汇总信息 。go tool cover
工具:go tool cover
可处理生成的日志,生成 HTML 报告 。如$ go tool cover -html=c.out
,在报告界面中,绿色(浅灰色 )标记的语句块表示被覆盖,红色(加阴影深灰色 )表示未被覆盖 。一元操作符Eval
方法未被覆盖,添加新测试用例可使其被覆盖;panic
语句未覆盖属正常,因不应执行到 。
Benchmark 函数
基准测试是在一定工作负载下检测程序性能的方法 。在 Go 中,基准测试函数名以Benchmark
为前缀,拥有*testing.B
参数,提供与性能检测相关方法,还包含整数型变量N
,用于指定被检测操作的执行次数 。
基准测试运行器开始时因不确定操作耗时,先用较小N
值检测,再推断出足够大的N
值以检测稳定运行时间 。在基准测试函数中实现循环,可在循环外执行必要初始化代码且不影响每次迭代时间 ,testing.B
参数提供停止、恢复和重置计时器的方法 。
基准测试不仅告知给定操作绝对耗时,还用于比较不同操作相对耗时 。如处理不同数量元素耗时比较、I/O 缓冲区最佳大小选择、不同算法性能对比等 。性能比较函数可被多个Benchmark
函数传入不同值调用 ,编写时注意不要用b.N
作为输入大小,除非作为固定大小输入的循环次数 。基准测试在程序设计及演进过程中都有重要作用 。
性能剖析
基准测试对检测操作性能有帮助,但优化程序时,不能盲目过早优化 。多数情况下,过度关注微小性能提升是浪费时间,约 97% 场景中过早优化有害 。但也不能错过关键的 3%,需仔细排查关键代码,而不能仅凭直觉认定,性能剖析是发现关键代码的最佳技术 。
性能剖析通过自动化手段,基于程序执行中性能事件采样进行性能评测,生成性能剖析报告 。Go 支持多种性能剖析方式,每种与不同性能指标相关,且需记录相关事件及对应栈信息 :
- CPU 性能剖析:识别执行过程中占用 CPU 多的函数 。CPU 上执行线程定时被操作系统中断,中断时记录性能剖析事件 。
- 堆性能剖析:找出分配内存多的语句 。性能剖析库对内存分配调用采样,每个事件平均记录分配 512KB 内存 。
- 阻塞性能剖析:识别阻塞协程久的操作,如系统调用、通道数据收发、获取锁等 。协程被阻塞时记录事件 。
获取与分析性能剖析报告
- 获取报告:通过
go test
指定标记获取性能剖析报告,如-cpuprofile=cpu.out
、-blockprofile=block.out
、-memprofile=mem.out
。同时使用多个标记时,获取一种报告机制会覆盖其他类别报告 。非测试程序也可通过runtime API
启用性能剖析 。 - 分析报告:用
pprof
工具分析报告,通过go tool pprof
间接使用 。基本用法需传入可执行文件和性能剖析日志 。因性能剖析日志不含函数名,需结合可执行文件理解数据 。go test
启用性能剖析时会保存可执行文件并命名为foo.test
(foo
为被测包名 ) 。
Example 函数
func ExampleIsPalindrome() {fmt.Println(IsPalindrome("A man, a plan, a canal: Panama"))fmt.Println(IsPalindrome("palindrome"))// 输出 :// true// false
}
示例函数是go test
特殊对待的函数,以Example
开头 ,无参数无结果 。文中给出ExampleIsPalindrome
示例函数,用于展示IsPalindrome
函数功能,通过打印该函数对不同字符串的判断结果,并注释预期输出 。
示例函数目的
- 作为文档:是描述库函数功能简洁直观的方式,可演示 API 中类型和函数交互 。基于
Example
函数后缀,godoc
文档服务器可将其与所演示函数或包关联 ,如ExampleIsPalindrome
和IsPalindrome
函数文档关联 。 - 可执行测试:若示例函数最后含
// 输出 :
注释,go test
运行时会执行该函数并检查输出与注释文本是否匹配 。 - 提供手动实验代码:
godoc
文档服务器利用 Go Playground 让用户在 Web 浏览器编辑运行示例函数,方便了解函数功能或语言特性 。
参考资料:《Go程序设计语言》
相关文章:
Go:测试
go test 工具 go test是 Go 语言包的测试驱动程序 ,包依据特定约定组织 。包目录中以_test.go结尾的文件是go test编译对象,而非go build的编译目标 。 特殊测试函数 在*_test.go文件中有三种特殊函数 : 功能测试函数:以Test为…...
用微信小程序制作一个性行为同意协议系统
用微信小程序制作一个性行为同意协议系统 用微信小程序制作一个性行为同意协议系统,具备查询、修改、增加和演示的Web功能。首先,我需要明确这个系统的核心功能和法律合规性。性同意是一个敏感且法律相关的话题,必须确保系统的设计符合法律法…...
leetcode 122. Best Time to Buy and Sell Stock II
题目描述 这道题可以用贪心思想解决。 本文介绍用动态规划解决。本题分析方法与第121题一样,详见leetcode 121. Best Time to Buy and Sell Stock 只有一点区别。第121题全程只能买入1次,因此如果第i天买入股票,买之前的金额肯定是初始金额…...
FairyGUI图标文字合批失败的原因
1)FairyGUI图标文字合批失败的原因 2)为什么Cubemap的内存占用超高 3)如何找到网格某个切面的中心点 4)为什么SafeZone在倒屏后方向相反 这是第428篇UWA技术知识分享的推送,精选了UWA社区的热门话题,涵盖了…...
C/C++ 通用代码模板
✅ C 语言代码模板(main.c) 适用于基础项目、算法竞赛或刷题: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <stdbool.h> #include <math.h>// 宏定义区 #define MAX_N 1000 #defi…...
void MainWindow::on_btnOutput_clicked()为什么我在QT里面没有connect,也能触发点击效果
在 Qt 中,即使你没有显式调用 connect 函数,某些信号(如按钮的 clicked() 信号)仍然可以触发槽函数。这是因为 Qt 提供了一种自动连接机制,称为 自动连接(Auto-Connection)。以下是可能的原因和…...
基于YOLO11的车牌识别分析系统
【包含内容】 【一】项目提供完整源代码及详细注释 【二】系统设计思路与实现说明 【三】系统数据统计与可视化分析支持 【技术栈】 ①:系统环境:Windows/macOS/Linux ②:开发环境:Python 3.8 ③:技术栈&#x…...
openwebui搭建mcp
1、升级ollama https://github.com/ollama/ollama/blob/main/docs/faq.md curl -fsSL https://ollama.com/install.sh | shOllama 启动后,设置外网访问_ollama 外部访问-CSDN博客 ubuntu安装deepseek-CSDN博客 sudo vim /etc/systemd/system/ollama.serviceEnvi…...
邀请函 | 知从科技邀您共赴2025上海车展
2025上海车展将于4月23日至5月2日在国家会展中心(上海)盛大举行。本届车展以 “科技智驾未来”为主题,共同展示新能源汽车、智能驾驶等领域的最新技术与成果。 知从科技将携行业领先的软件产品与技术服务亮相于本次展览会,全方位…...
ESP32开发工具链选择指南:ESP-IDF vs PlatformIO vs Arduino
1. 引言 ESP32作为乐鑫(Espressif)推出的一款高性能Wi-Fi & Bluetooth双模芯片,凭借其强大的性能和丰富的生态,在物联网(IoT)领域广受欢迎。然而,开发ESP32时面临的一个关键问题是…...
【JAVA】bat文件启动jar场景获取bat文件路径的方法
一、推荐方案:参数传递法 步骤1:修改BAT脚本 echo off java -jar -Dbat.file"%~f0" your-app.jar %*关键参数说明: %~f0:获取BAT文件的完整路径%*:传递所有原始参数 步骤2:Java代码获取参数 …...
OpenLayers:extent与view extent 介绍
一、范围的概念 1.什么是范围? 在Openlayers中范围(Extent)是用于表示地理空间区域的一种概念。它通常由一个数字数组构成,数组中的内容为:[最小x坐标,最小y坐标,最大x坐标,最大y坐…...
Python开发一个简单的软件系统
用Python语言实现,具备录入学生成绩、查询成绩和显示所有成绩等基本功能。以下是代码: # 用于存储学生成绩的字典,键是学生姓名,值是成绩 student_scores {} # 录入学生成绩的函数 def input_scores(): name input("…...
小草GrassRouter多5G聚合路由设备在应急公安消防行业的解决方案及重要作用
小草GrassRouter多5G聚合路由设备在应急、公安、消防等行业的解决方案及重要作用主要体现在以下几个方面,这些领域对通信的高可靠性、高带宽、低时延需求尤为突出,尤其在复杂环境或突发事件中需要保障指挥调度的实时性和稳定性: ** 一、行业…...
冒泡排序、插入排序、快速排序、堆排序、希尔排序、归并排序
目录 冒泡排序插入排序快速排序(未优化版本)快速排序(优化版本)堆排序希尔排序归并排序各排序时间消耗对比 冒泡排序 冒泡排序核心逻辑就是对数组从第一个位置开始进行遍历,如果发现该元素比下一个元素大,则交换位置,如果不大,就…...
JVM知识
JVM 内存模型 JVM的内存模型介绍一下 根据 JVM8 规范,JVM 运行时内存共分为虚拟机栈、堆、方法区、程序计数器、本地方法栈五个部分。 JVM的内存结构主要分为以下几个部分: 方法区:存放类对象 Java 虚拟机栈:存放方法之间的调…...
Docker 中多个容器之间的通信
在 Docker 中,多个容器之间的通信可以通过以下几种主要方式实现,具体选择取决于网络需求、隔离性及管理复杂度: 一、自定义 Bridge 网络(推荐) 通过创建自定义的 Docker 网络,容器可以加入同一网络并通过容…...
docker desktop for windows 登录国内镜像仓库
在使用 Docker Desktop for Windows 时,如果你希望连接到国内的 Docker 镜像仓库(例如阿里云、腾讯云等),你可以通过配置 Docker 镜像加速器来实现。以下是一些步骤和示例,帮助你设置 Docker Desktop for Windows 以使…...
【blender小技巧】使用blender的Cats Blender Plugin插件将3D人物模型快速绑定或者修复为标准的人形骨骼
文章目录 前言绑定或者修复人形骨骼1、下载模型2、导入模型到blender中3、删除无用的相机和灯光3、导出模型并在unity中使用 专栏推荐完结 前言 有时候我们下载的3D人物模型,可能不带骨骼信息,或者带一些错乱的骨骼信息。这时候我们就可以使用blender将…...
视频压缩技术学习(不高明版本)
1. 压缩的本质与核心目标 视频压缩的核心在于去除冗余信息,包括空间冗余(相邻像素相关性)、时间冗余(连续帧相似性)以及视觉冗余(人眼感知特性)。通过算法优化,在保持可…...
在Vue项目中查询所有版本号为 1.1.9 的依赖包名 的具体方法,支持 npm/yarn/pnpm 等主流工具
以下是 在Vue项目中查询所有版本号为 1.1.9 的依赖包名 的具体方法,支持 npm/yarn/pnpm 等主流工具: 一、使用 npm 1. 直接过滤依赖树 npm ls --depth0 | grep "1.1.9"说明: npm ls --depth0:仅显示直接依赖…...
【Web前端技术】第一节—HTML简介
做出一个属于自己的网站! 云边有个稻草人-个人主页 为你,千千万万遍 ——哈桑 目录 一、网页 1.什么是网页? 2. 什么是 HTML? 3. 网页的形成 二、常用浏览器 1. 常用浏览器 2. 浏览器内核 三、Web标准(重点&…...
LINUX 416 路由转发1
那干脆先配置一下 boot目录必然是标准分区 配路由转发实验 路由器 计划新建3个虚拟机,分别是主机、节点a、节点b,都时间仅主机模式 路由器网卡IP: 节点a路由表 这次装载了附件,桌面安装模式,不用像 最小化安装模式那样折…...
【音视频开发】第四章 SDL音视频渲染
【音视频开发】第四章 SDL音视频渲染 文章目录 【音视频开发】第四章 SDL音视频渲染一、简介1.什么是 SDL 二、Windows 环境搭建三、SDL 子系统四、Window 显示1.SDL 视频显示函数简介2.窗口渲染结构体 五、SDL 事件1.通用事件结构体 SDL_Event2.事件类型 六、SDL 线程1.常用线…...
音频基础概念
声音 物体在一定的振动频率下产生了声音。声音可以被分解为不同频率不同强度正弦波的叠加。 声音三要素 声调 音调: 由发声体振动的频率决定,频率越高(振动越快)则音调越高,听起来就越“刺耳”,反之音调越低、听起…...
rust编程学习(二):复合数据类型
复合数据类型是由其他类型组合而成的类型。Rust的复合数据类型有元组、数组、结构体、枚举等, 通过一些简单的例子帮助大家快速了解Rust复合类型。 1 元组类型 元组类型是由一个或多个类型的元素组合成的复合类型,使用小括号“()”把所有元素放在一起。…...
学习笔记十四——一文看懂 Rust 迭代器
🌀 一文看懂 Rust 迭代器 📚 目录导航 什么是迭代器?为什么 Rust 到处都在用它?Rust 迭代器的底层逻辑是什么?适配器 vs 消费者:谁是主角?常见适配器:加工数据的全能工厂常见消费者…...
H.265硬件视频编码器xk265代码阅读 - 帧内预测
源代码地址: https://github.com/openasic-org/xk265 帧内预测具体逻辑包含在代码xk265\rtl\rec\rec_intra\intra_pred.v 文件中。 module intra_pred() 看起来是每次计算某个4x4块的预测像素值。 以下代码用来算每个pred_angle的具体数值,每个mode_i对应…...
贪心算法学习C++
1,跳跃游戏II 题目连接:45. 跳跃游戏 II - 力扣(LeetCode) 【题目描述】 在给定的一个nums数组中,nums[i]表示从当前i位置最多可以向后跳跃nums[i]个位置。问跳跃到最后 数组最后一个元素的最少跳跃次数?…...
Go 语言实现的简单 CMS Web
Go 语言实现的简单 CMS Web 以下是一个使用 Go 语言实现的简单 CMS Web 演示代码示例, 包含基本的内容管理功能: 项目结构 ### 项目结构 cms-demo/ ├── main.go ├── handlers/ ├── models/ ├── views/ │ ├── home.html │ ├─…...
Zookeeper选举机制
一、选举机制的核心原理 ZooKeeper的选举机制基于ZAB协议(ZooKeeper Atomic Broadcast),这是一种为分布式系统设计的原子广播协议。其核心目标是快速选举出Leader节点,并确保数据一致性。以下为关键原理: 1. 选举触发…...
安卓自定义build的apk文件名
android studio打包应用默认生成的apk名称是:app-release.apk 。 如果我们想修改生成的apk文件名,比如想放入版本号,比如想放入渠道号,又比如和打包时间有关联,那我们就需要能自动化生成可自定义的apk文件名ÿ…...
【Web APIs】JavaScript 操作多个元素 ④ ( 表格全选复选框案例 )
文章目录 一、核心要点解析 - 表格全选复选框案例1、案例需求2、复选框设置3、获取 全选复选框 和 普通复选框4、设置 全选复选框 逻辑5、设置 普通复选框 逻辑 二、完整代码示例1、代码示例2、执行结果 一、核心要点解析 - 表格全选复选框案例 1、案例需求 在表格中 , 设置 多…...
Lua 第6部分 函数
在 Lua 语言中,函数( Function )是对语句和表达式进行抽象的主要方式。 函数既可以用 于完成某种特定任务(有时在其他语言中也称为过程 ( procedure )或子例程 ( s ubroutine) ), 也可以只是进行…...
OpenCv高阶(五)——SIFT特征提取
目录 SIFT特征提取 一、原理核心步骤 1. 尺度空间极值检测 2. 关键点定位 3. 方向分配 4. 描述子生成 二、SIFT算法具有的特点 三、SIFT特征提取器的简单使用 1、特征检测器的创建 2、 检测图像中的关键点 3、绘制关键点 4、计算关键点描述符 四、SIFT 算法的优缺点…...
基于Spring MVC的客户端真实IP获取方案解析
文章目录 基于Spring MVC的客户端真实IP获取方案解析概述核心方法解析代码实现工作流程 IP获取优先级策略IP有效性验证异常处理与日志使用场景注意事项扩展建议 基于Spring MVC的客户端真实IP获取方案解析 概述 在Web应用开发中,准确获取客户端真实IP地址是常见的…...
JavaScript爬虫基础篇:HTTP 请求与响应
在互联网的世界里,数据无处不在。无论是新闻资讯、商品信息,还是社交媒体动态,这些数据都以各种形式存储在服务器上。而爬虫,就是我们获取这些数据的得力助手。今天,我们就来聊聊爬虫的基础——HTTP 请求与响应&#x…...
【Java基础】Java集合遍历方式
前言 在Java编程中,集合(Collection)是存储和操作对象的核心工具。遍历集合是开发者最频繁的操作之一,但不同场景下选择合适的遍历方式至关重要。 一、基础遍历方式 1. 基本for循环 适用场景:仅适用于List等有序集…...
KWDB创作者计划—深度解析:AIoT时代的分布式多模型数据库新标杆
在AIoT(人工智能物联网)快速发展的今天,数据的多样性、实时性和复杂性对数据库提出了前所未有的挑战。传统的数据库架构往往难以同时满足时间序列数据的高效处理、关系型数据的复杂查询以及多模型数据的无缝集成需求。而KWDB 2.2.0版本的发布…...
智慧城市大数据整体建设方案,数据中台方案(word)
第1章 总体说明 1.1 建设背景 1.2 建设目标 1.3 项目建设主要内容 1.4 设计原则 第2章 对项目的理解 2.1 现状分析 2.2 业务需求分析 2.3 功能需求分析 第3章 大数据平台建设方案 3.1 大数据平台总体设计 3.2 大数据平台功能设计 3.3 平台应用 第4章…...
Nginx:轻量级高性能的Web服务器与反向代理服务器
目录 一.引言 二.Nginx的核心特点 2.1高性能与高并发 2.2低资源消耗 2.3功能丰富 2.4高度扩展性 三.Nginx的应用场景 3.1静态资源服务器 3.2反向代理服务器 3.3API网关 3.4Nginx的配置与使用 四.总结 一.引言 在互联网高速发展的今天,Web服务器的性能与…...
【Pandas】pandas DataFrame pop
Pandas2.2 DataFrame Indexing, iteration 方法描述DataFrame.head([n])用于返回 DataFrame 的前几行DataFrame.at快速访问和修改 DataFrame 中单个值的方法DataFrame.iat快速访问和修改 DataFrame 中单个值的方法DataFrame.loc用于基于标签(行标签和列标签&#…...
Spring Boot集成MinIO的详细步骤
1. 安装MinIO 使用Docker部署MinIO 拉取MinIO镜像: docker pull minio/minio 这将从Docker Hub中获取最新的MinIO镜像。 创建目录: mkdir -p /home/minio/config mkdir -p /home/minio/data 这些目录将用于持久化MinIO的数据和配置文件 创建MinIO…...
【文献笔记】SatLM: Satisfiability-Aided Language Models Using Declarative Prompting
SatLM: Satisfiability-Aided Language Models Using Declarative Prompting 原文代码 标题翻译:SATLM:使用声明式提示的语言模型SAT辅助 1. 简介 1.1. 研究问题 文章提出了SATLM方式,使用LLM生成声明性任务规范,而不是命令式…...
LRU算法
package LRU缓存;import java.util.Arrays; import java.util.HashMap;//建立一个双向队列 class MyQueueNode{int key;int value;MyQueueNode pre;MyQueueNode next;public MyQueueNode(int key,int value){this.key key;this.valuevalue;} } class MyQueue{MyQueueNode head…...
二进制和docker两种方式部署Apache pulsar(standalone)
#作者:闫乾苓 文章目录 1、二进制安装部署Pulsar(standalone)1.1 安装配置JDK1.2 下载解压pulsar安装包1.3 启动独立模式的Pulsar 集群1.4 创建主题测试1.5 向主题写入消息测试1.6 从主题中读取消息测试 2.docker安装部署Pulsar(standalone)2.1 使用docker 启动Pul…...
【物联网】基于LORA组网的远程环境监测系统设计
基于LORA组网的远程环境监测系统设计 演示视频: 简介: 1.本系统有一个主机,两个从机。 2.一主多从的LORA组网通信,主机和两个从机都配备了STM32F103单片机与 LoRa 模块,主机作为中心设备及WIFI网关,负责接收和发送数据到远程物联网平台和手机APP,两个从机则负责采集数…...
k8s+有状态nacos账户密码安全认证开启+springcloud 配置
nacos 账号密码登录,默认未开启验证权限,不登录也能访问nacos控制台配置文件,生产环境非常不安全。所以需要手动开启安全认证。本地启动nacos的 application.properties配置文件更改如下: ### The auth system to use, currently only nacos …...
《分布式软总线赋能老旧设备高效通信》
在数字化转型的浪潮中,分布式软总线技术成为实现设备互联互通的关键力量。然而,当面对大量老旧设备时,其性能受限的现状对分布式软总线提出了严峻挑战。如何在这些性能瓶颈下,让老旧设备实现高效连接与通信,是亟待解决…...
07-云原生安全深度剖析:从 Kubernetes 集群防护到微服务安全加固
云原生安全深度剖析:从 Kubernetes 集群防护到微服务安全加固 一、云原生时代的安全挑战 1.1 云原生架构的复杂性引入新风险 在云原生架构下,Kubernetes 集群管理着大量动态变化的容器化应用,微服务通过 API 频繁交互,传统安全…...