Golang技术栈归结
kratos系列 ***
kratos项目中使用分布式锁介绍 基于etcd实现的分布式锁 / 另外一个kratos_rockscache项目中有介绍使用SETNX命令实现一个简单的非等待的分布式锁
kratos项目中使用gorm的Transaction的方法介绍 ***** 事务开始时使用tx / 事务的2种使用方法(biz层中与data层中) / 使用依赖注入初始化Transaction / 使用ctx传递tx / 不能在事务中并发去select / 可以在事务中并发去调用更新与创建方法 / 递归获取无限极分类数据(存储与方法、proto的定义、一个项目使用2个biz操作不同业务的数据库) / 关于并发去开启MySQL事务以及MySQL数据库隔离级别问题可以详细查看README.md以及其他markdown文件说明
kratos项目集成kafka介绍 还有将yaml配置文件加载到biz层使用的方法
kratos中使用kafka等消息中间件介绍 注意kratos-transport版本问题 / NSQ的使用 / B站视频链接
kratos项目使用中间件Middleware介绍 注意server/http.go中httpServer除了中间件的各种配置项(还有CORS配置、封装响应体结构) / 在ctx中传递uid /
kratos项目使用错误码介绍 注意server/http.go中封装的响应结构的写法
kratos中使用rockscache介绍 有pipeline的Exec方法接收redis.Nil错误 / 解析map结构的yaml配置 / 使用python脚本做“防击穿”机制 / redis的SETNX实现非等待的分布式锁 / "防穿透的字符串"的两种处理思路
kratos中使用kafka不同group消费同一个topic的坑
kratos项目中使用jaeger做链路追踪 trace / 使用resty包发http请求然后将http请求与响应信息加到trace中(span.SetAttributes) / 使用ctxWithoutCancel异步发http请求时跟主协程的ctx停了不影响发http的子协程
Kratos中使用gin处理excel文件上传与下载并批量往数据库与Redis中写入数据 wire的方式注册gin+在server/http.go中初始化gin/专门加一个biz的usecase给gin用/批量创建时限制一次create的数量/子句构造器实现onConfilct的详细说明与demo /上传文件注意限制下一次上传的数量与单个文件的大小 / 使用pipeline每100个数据写入Redis一次 / 使用proto生成的go结构体中omitempty标签的问题
kratos中使用etcdWatch介绍 ***** 初始化kratos封装的etcdCustom时在clean函数中加上cancel掉ctx的操作,防止goroutine泄漏
kratos使用kafka指定分区发送消息 *****
kratos中集成定时任务介绍 ***** 那个layout项目还有配套博客好好看下 / 新加一个与http与grpc同级的定时任务的server / 还有trace链路追踪 / github上那个kratos-layout研究下
kratos项目中捕获panic的方法介绍 ***** kratos原生http / 详细使用gin框架的http / Service中写defer + recover函数捕获 / 自定义中间件 / gin框架详细的使用 / Server中间件将traceId封装到请求头中 / encoder不仅定义返回的结构还从请求头中获取traceId
kratos项目使用Nacos作为配置中心的操作介绍 *****
Golang操作kafka遇到分区扩容消费新分区数据的问题 *****
Kratos项目中使用dtm分布式事务 app_server有使用etcd注册与发现服务 / pkg包使用gconv包转换结构体及结构体切片 /
Nacos系列 ****
Goalng处理原生HTTP相关文章总结 ***
使用Go处理SDK返回的嵌套层级数据并将所需字段存入数据库(一)
使用Go解析HTTP返回数据为struct并存入数据库的操作 *** HTTP数据转json/json转结构体/结构体数据写入数据库/GORM查询单个及多条数据/时间字符串转时间戳
利用递归的方式获取restful风格有nextUrl接口返回的数据
使用go的http获取三方API的数据 *请求数据并将结果解析为map/string(有bug,后面加上使用连接池以及完善有err返回的写法)
使用Go处理HTTP压缩文件数据总结 *** 解压的2种思路/自定义错误/判断文件夹存在
MySQL与GORM相关 ***
Gorm中查询是否返回recordNotFound的情况总结
gorm更新数据遇到的空值问题 *** gorm使用map修改空值 / structs包结构体转map / validator包校验结构体
gorm使用Save方法处理时间字段的坑 实际代码中尽量别用save了(跟数据库版本有关系有些版本数据库存0001-0001-0001这样的数据会报错) / 创建时间与更新时间的gorm标签加上default:null,在数据库中设置默认时间是当前时间并且更新时间随着每次更新的时间变化
Gorm中使用sum查询没有数据返回null的一个问题 IFNULL函数 / 如果数据库中没有相关数据sum函数返回的是null,count函数返回0
Redis相关 ***
redis协议介绍 *****
Redis内存使用率增长的一些解决思路 ****** scan命令 / 使用redis-cli配合其他命令将数据导出到本地
2024杂谈 ****
go1.22的一些关键改动及代码演示 *(在电脑中安装多个版本的go解释器)
golang中好用的并发包conc介绍 *****
go-zero中好用的流处理利器fx与mr介绍 ***** (+使用并发包需要注意的问题)
使用Golang操作kafka消费指定分区数据 *****
2023杂谈 ***
golang中使用原子操作监听配置更新 atomic.Value的用法 / sync.Cond等待通知 / 加载json文件 / 获取文件hash值
压测合集 wrk/sysbench/ghz
压测: wrk压测的lua脚本使用随机列表与字符串参数 *****
使用pipeline执行命令遇到redis.Nil的坑 pipeline.Exec(ctx) 方法批量查询记得捕获redis.Nil这个错误
go-zero中好用的流处理利器fx与mr介绍 ***** (+使用并发包需要注意的问题)
使用fx.Parallel方法并发执行函数时遇到的惰性计算的坑
gorm中使用子句构造器实现on duplicate key update的效果 该方法是并发安全的 / 封装的事务分别在biz层与data层中的使用 / 引入gf的gconv包
Golang中处理JSON字符串相关总结 gjson、jsonIter(有benchmark基准测试的写法~)等
Golang中好用的三方工具包lancet介绍 有结构体切片的转换
使用golang灵活处理动态文案 正则表达式 / 字符串替换
2022杂谈 ***
xorm+postgreSQL实现事物与in查询 *** xorm事物/xorm拼接in操作/insert遇到主键冲突 on conflict do nothing或update
golang生成随机字符串 ***2种方法/还有性能测试的代码
Golang中slice操作的一些问题 *** slice引用类型的特殊问题
Golang获取随机float64(正数)数据与随机int数据(可以是负数) *** decimal包的使用
Golang处理小数四舍五入与不进行四舍五入的用法 *** decimal包的使用
使用channel控制并发数以及超时的写法 ***还有超时的写法
sync.Once的基本使用以及拓展 单例模式/带返回错误/查询是否初始化过
使用errgroup并发查询数据库 使用channel控制并发量 / 参考文章中有一个异步时ctx cancel 的坑注意一下!
golang实现等待通知机制的方法 sync.Cond / sync.Waitgroup / channel实现
golang中goroutine泄漏的问题以及解决方案 goroutine泄漏/退出协裎
2021杂谈 ***
Go struct类型的map结构体成员不能修改的问题 ***
使用mysqldump同步两台服务器中不同数据库相同表结构的表 shell脚本手动同步MySQL
Golang中使用recover捕获panic的操作及遇到的一个坑
项目中使用进程内缓存的一些经验及注意事项 *** 进程缓存使用及注意事项
postgreSQL数据备份与迁移的完美实践 *** pgdump/pgrestore
MySQL与postgreSQL在left join查询时的区别
使用waitgroup在循环中开Goroutine处理并发任务 **
MySQL与PostgreSQL中解决插入主键冲突的问题 *** on conflict do / ON DUPLICATE KEY
Golang结构体与JSON相互转换时的小技巧 结构体标签中将float64数据类型解析为string
Golang结构体序列化与反序列化时初始值的问题 *** omitempty标签/
关系型数据库跨时区查询简介 *** postgreSQL跨时区查询
Redis内存使用率增长的一些解决思路 ****** scan命令 / 使用redis-cli配合其他命令将数据导出到本地
Python VS Golang
浅谈Python与Golang中的“惰性求值” *** 闭包与goroutine的惰性求值/waitGroup的写法/惰性查询/惰性计算
Python与Golang中给列表中字典按照某个key排序的实现以及Go中给切片中的结构体排序 ***给列表中的 字典/结构体 按照key排序 / 优先级特殊排序
在Golang中实现与Python装饰器类似功能的方法 ***Go中实现类似Python装饰器的效果
Python与Golang中“类的归一化设计”实现与对比 ***
Python与Go列表切片越界的对比 **** golang切片越界获取不超过容量不会报错但是多余的会获取到“零值”
Golang中实现Python里面in操作的方法 ***第三方实现的一个hashset包
封装方法
go语言结构体转map的方法 *** 推荐lancet包中的方法可以用json标签 & structs包
Golang中map转结构体的不同方法 *** 注意带下划线字段的处理 mapstructure包
golang基础数据类型转换小结 (int/float/string/byte相互转换)*****
golang时间与时区相关操作总结(时间时区操作)*****
各种结构相互转换 (相对较乱,后面再拆分总结)
使用golang实现的一个LRU缓存模块 *没有redis的话可以使用这个低级的缓存/加锁保证并发安全
常用操作
go常用操作 ***一些操作小技巧
Golang序列化与反序列化操作总结及一些实践经验 *** JSON序列化与反序列化
零碎杂谈
实践指南
使用Go处理SDK返回的嵌套层级数据并将所需字段存入数据库(一)
使用Go解析HTTP返回数据为struct并存入数据库的操作 *** HTTP数据转json/json转结构体/结构体数据写入数据库/GORM查询单个及多条数据/时间字符串转时间戳
利用递归的方式获取restful风格有nextUrl接口返回的数据
使用go的http获取三方API的数据 *请求数据并将结果解析为map/string(有bug,后面加上使用连接池以及完善有err返回的写法)
doris中的临时分区以及golang删除doris临时分区的操作
使用Go解压文件总结
使用Go处理HTTP压缩文件数据总结 *** 解压的2种思路/自定义错误/http连接池/判断文件夹存在
学习记录
gin框架学习
官方文档中的许多实例
https://gin-gonic.com/zh-cn/docs/examples/ ***
个人笔记
gin框架入门练习笔记 * 获取参数/重定向/路由/中间件/运行服务等
gin项目的路由拆分与注册 *(实际项目大概结构)