Go语言Mock单元测试的实现示例
目录一、为什么需要Mock测试?1. 依赖环境难搭建2. 测试结果不稳定3. 测试效率低且有风险二、Mock测试的核心原理明确测试目标与依赖关系1. 基于接口的依赖抽象2. 生成Mock对象并预设行为3. 注入Mock并验证测试结果三、项目中实现Mock测试需额外添加什么?1. Mock对象实现文件(如mocks.go)2. 测试用例文件(如shopping_tes ...
Go 语言中控制协程数量的常用方法小结
目录一、使用带缓冲的通道控制二、使用 sync.WaitGroup 配合通道三、使用工作池(Worker Pool)模式四、使用第三方库在 Go 语言中,协程(goroutine)是轻量级的执行单元,虽然开销小,但无限制地创建协程仍然会消耗大量系统资源,甚至导致程序崩溃。因此,合理控制协程数量是编写高效 Go 程序的关键。本文将介绍几种常用的 ...
go语言中GoMock的实现
目录安装开始使用参数匹配器GoMock是一个Go框架。它与内置的测试包整合得很好,并在单元测试时提供了灵活性。正如我们所知,对具有外部资源(数据库、网络和文件)或依赖关系的代码进行单元测试总是很麻烦。
安装
为了使用GoMock,我们需要安装gomock包github.com/golang/mock/gomock和mockgen代码生成工具github.com/golan ...
Golang使用elastic库来实现前后端模糊搜索功能
目录介绍工具后端前端快速入门先决条件实现思路运行测试注意事项介绍
使用go的elastic库来实现前后端模糊搜索功能的示例
工具
后端
connectrpc.com/connect:与前端通信connectrpc.com/cors:解决浏览器跨域google.golang.org/protobuf: API定义buf:生成go的apisqlc:与Postgres数据库交互github.com/elastic/go-elastics ...
Go 通道引用与close操作的实现
目录一、核心结论(先给答案,不绕弯)二、逐点拆解:把原理讲明白1. 通道是 “引用类型”,不是指针但行为类似2. close 操作作用于 “底层通道”,所有引用都会感知3. 内存泄露风险:几乎不存在,无需过度担心三、代码验证:直观感受引用与 close 的影响运行结果:结论验证:在 Go 开发中,通道(chan ...
go-redis Pipeline与事务的实现示例
目录1 背景与动机2 Pipeline:降低 RTT 的秘密武器2.1 基础用法2.2 自动化Pipelined()2.3 性能实测 & 调优3 事务:一次提交,全部成功3.1TxPipeline()基础3.2TxPipelined()回调3.3 事务 vs Lua 脚本4 乐观锁:Watch 机制剖析4.1 完整重试模型4.2 常见坑与最佳实践5 生产级 Checklist6 结语1 背景与动机
在高并发服务中,网 ...
golang中使用aes加密的过程
目录AES 加密基础生成密钥加密数据解密数据使用 GCM 模式(推荐)注意事项AES 加密基础
AES(Advanced Encryption Standard)是一种对称加密算法,适用于加密敏感数据。Golang 的 crypto/aes 包提供了 AES 加密的实现,通常结合 crypto/cipher 包使用。
生成密钥
AES 密钥长度需为 16(AES-128)、24(AES-192)或 32(AES- ...
Go log模块的使用技巧
目录Go log模块使用1.主要特性2. 基础日志输出2.1 基本日志方法2.2 错误处理日志3. 日志格式配置3.1 设置日志标志3.2 可用的日志标志4. 日志前缀配置4.1 设置日志前缀5. 文件日志输出5.1 将日志输出到文件5.2 文件打开模式说明6. 自定义Logger6.1 使用log.New()创建自定义Logger6.2 多个Logger实例7. 高级用法7.1 日志级别 ...
Golang重构wget脚本构建通用并发下载工具的实践指南
目录1. 传统wget方式的局限性2. Golang并发下载器设计思路2.1 协议兼容性处理2.2 并发架构设计2.3 文件完整性保障3. 核心实现方案3.1 协议自动判断与处理3.2 统一下载接口3.3 并发安全控制4. 关键技术与优化策略4.1 文件分块策略4.2 断点续传实现4.3 错误重试机制5. 实战:替代wget脚本的完整实现6. 性能对比与效果评估在当 ...
Golang操作Redis的实现示例
目录一. Redis介绍1.1 简介1.2 Redis优势1.3 redis的使用二. 链接Redis三. String类型的Set,Get操作四. String批量操作五. 设置过期时间六. List队列操作七. Hash表八. Redis连接池一. Redis介绍
1.1 简介
Redis是完全开源免费的,遵循BSD协议,是一个高性能的key-value数据库。
Redis与其它的key-value缓存产品有以 ...
Golang中TLS版本设置的实现步骤
目录Golang中TLS版本设置1. Go源码中的TLS2. https服务端修改TLS支持版本3. 抓包验证Golang中TLS版本设置
1. Go源码中的TLS
最近在看Go源码中的http框架和tls实现框架实现,go中的TLS实现了TLS1.0, TLS1.1, TLS1.2, TLS1.3 四个版本,还有SSL3.0版本, 不过代码中已经明确说明不再支持SSL3.0版本。
const (
VersionTLS10 = ...
Go Slice 实现原理从底层机制到工程实践详解
目录前言:为什么需要深入理解 Slice?一、Slice 的本质:结构体与底层数组1.1 Slice 的底层数据结构1.2 与数组的本质区别二、Slice 的创建方式与内存布局2.1 通过make创建:显式控制长度与容量2.2 通过数组/切片截取:共享底层数组2.3 高级截取:显式控制容量(少用但重要)三、扩容机制:append 背后的性能陷阱3.1 扩容触 ...
Go语言中:= 运算符短变量声明的使用小结
目录基本语法和用途使用示例基本用法同时声明多个变量在条件语句中使用在 for 循环中使用特殊规则和边界情况1. 非新变量赋值(至少一个变量是新声明的)2. 作用域限制3. 类型推断规则4. 类型断言用法5. 错误处理常用模式与var的区别最佳实践常见错误错误1:尝试重复声明错误2:超出作用域访问错误3:非函数作用域使用总结:= ...
golang循环变量捕获问题的解决
目录问题背景问题原因解决方案:将循环变量作为参数传递深入技术解释在你的计数器代码中的应用其他解决方案总结在 Go 语言中,当在循环中启动协程(goroutine)时,如果在协程闭包中直接引用循环变量,可能会遇到一个常见的陷阱 - 循环变量捕获问题。让我详细解释一下:
问题背景
看这个代码片段:
for i := 0; i ...
Go语言创建结构体实例对象的几种常用方式
目录1. 内存分配与类型差异2. 初始化方式对比3. 修改行为与内存开销值类型实例 (Person{}或var p Person)指针类型实例 (new()或&erson{})4. 实际内存布局示意图值类型实例指针类型实例5. 各场景使用建议性能测试对比终极选择指南在 Go 语言中,创建结构体实例的几种方式有本质区别。以下是核心差异的详细对比:
1. 内存 ...
go无缓冲通道的实现及应用
目录1. 无缓冲通道的定义2. 阻塞行为分析3. 无缓冲通道的同步特性4. 无缓冲通道 vs 缓冲通道5. 常见问题与解决方案6. 实际应用场景总结在 Go 语言中,无缓冲通道(Unbuffered Channel) 是一种特殊的通道类型,它的行为与缓冲通道(Buffered Channel) 有显著区别。无缓冲通道的核心特点是同步阻塞,即发送和接收 ...
Golang中Context.WithCancel 的实战指南
目录1. 它到底做了什么2. 何时应当用WithCancel(context.Background())3. 基本用法示例4. 扇出/扇入与错误快速失败5. 与WithTimeout/WithDeadline的选择6. 常见坑与反模式7. 取消语义与错误判断8. 与外部 I/O 的协作9. 实战模式:优雅退出(信号触发)10. 简明清单1. 背景2. 示例代码3. 运行流程4. 关键点说明5. 常见扩展模 ...
Go语言同步机制的几种常用方法
目录1. 使用通道(Channel)2. 使用 sync 包3. 使用互斥锁(Mutex)总结在 Go 语言中,保证多线程(或者更准确地说,多协程)有序执行,主要依赖于协程间的同步机制。Go 提供了几种工具来帮助开发者控制协程(goroutine)的执行顺序,确保数据的一致性和操作的原子性。下面是一些常用的同步机制:
1. 使用通道(Channel)
...
Go语言公司gitlab私有仓库依赖拉取配置的两种实现方式
目录为什么要考虑私有仓库对于没有子目录的gitlab项目对于子目录的gitlab项目为什么要考虑私有仓库
Go语言目前都已经采用了官方统一的 go modules 来管理依赖,后续也不太可能出现比较乱的生态, 因此了解下如何让这个依赖管理正常工作是非常必要的。
对于Github或者其他公有仓库,依赖管理是非常直接和方便的,设置好GOPROX ...
golang中可触发panic的几种情况汇总
目录一. 触发panic 的场景1. 显式调用panic函数2. 运行时错误2.1 数组/切片越界2.2 空指针解引用2.3 类型断言失败2.4 除数为 02.5 字符串越界3. Channel 操作错误3.1 向已关闭的 channel 发送数据3.2 关闭 nil channel4. 内存或资源耗尽4.1 内存分配失败4.2 堆栈溢出(无限递归)5. 并发问题5.1 无锁的并发读写 map6. 其他 ...