golang

分类下相关文章

Linux fish shell 中自动补全 go Cobra 创建的命令

书接上回,自从基于 cobra 完成了 Golang AST 解析 struct 字段,自动生成 CRUD 代码,又添加了部分功能。这个自动帮我搬砖的代码生成器基本完成了。😊 但是,在项目中使用的时候,还是有点小瑕疵,就是不能在 fish shell 中自动补全命令,主要是我创建的命令,命令我自己都记不住🥲。每次靠输入 cobra 帮助参数来查看,也略显麻烦。于是,我想能否像 smug 一样,实现自动补全命令。查了一下,果然可以: 添加 fish 自动补全 cobra 内置了针对各种 shell 的自动补全功能。诸如,fish,bash,zsh,powershell。 例如,我的搬砖工具名为 ...

阅读全文...

Golang AST 解析 struct 字段,自动生成 CRUD 代码

上周基于 cobra 实现了一个 golang 的命令行工具, 参考:golang 快速开发命令行工具的神器 cobra & cobra cli,实现了一键生成 go gin 后台,及 react ant design 前端的 CRUD 工具。 大大提升了枯燥的 CRUD 劳作效率。并在两个项目上试水成功。 但是,还有一点不够完美,就是目前的 ant design 前端部分,只是个界面架子。 具体的编辑字段,还得手动一个个添加。这周又接到了一个无数 CRUD 的搬砖项目,我觉得有必要把这部分功能加上了。 这样才能无愧于我的“搬砖之王”的称号。 功能需求 即,使用 golang 解析一个 ...

阅读全文...

升级到 golang 1.23 版本后,gorm 的 count 统计总是返回 0

之前为了使用 excelize 的一个新功能, golang excelize 自动解析 excel 单元格的字体颜色, 将 golang 由 1.18 升级到了 1.23。但是遇到了 gorm 的一个 bug。 问题代码 var items []models.Article db := models.DB.Model(&models.Article{}). Preload("Category") db = db.Session(&gorm.Session{}) db.Order("id desc"). Limit(limit) ...

阅读全文...

golang 快速开发命令行工具的神器 cobra & cobra cli

最近想用 go 开发一个自动生成 gin CRUD 前后端代码的命令行工具,实现跟 python django 类似的快速搭建 admin 后台的体验。 于是找了一个类似的脚手架工具 nunu,但是这个项目的代码组织风格并不是我喜欢的类型,且没有 ant design 前端相关的模板,所以我打算自己重造这个轮子。动手之前,我粗略浏览了一遍 nunu 这个项目的代码,发现里面使用了 cobra 这个库,非常便捷。 在参加烟台八角湾数字经济大会时,边开发,边整理了这篇文档。倪光南院士在上面大讲 AI,我在下面写 CRUD。。。我们都有美好的未来 🥲 cobra 是什么 如果经常需要用 golang ...

阅读全文...

golang 调用高德地图接口,查询客户公司名称对应的经纬度坐标

为了做公司大堂的数据展示大屏,需要将客户公司展示在中国地图上。 而目前的 Excel 清单中并没有这些公司的经纬度信息,而且客户清单太长,靠手动查询是不现实的。 于是我决定使用高德地图的接口来自动查询这些公司的经纬度坐标。 返回数据格式 一个示例,例如: 查询“烟台毓璜顶医院”对应的经纬度坐标,执行发送 HTTP GET 请求到下面 URL https://restapi.amap.com/v3/geocode/geo?address=烟台毓璜顶医院&key=xxx 返回数据结构 { "status": "1", "in ...

阅读全文...

golang excelize 自动解析 excel 单元格的字体颜色

遇到一个奇葩的需求,公司内部的一个用来做数据导入的 Excel 表, 通过客户名称的字体颜色来表示是否是大客户。 而我的后台接口必须要解析出这个客户是否是大客户。(┬_┬) 最近被 excel 数据解析折磨疯了。 所以问题就变成了,使用 golang excelize 库,如何获取 excel 中某个单元格的 font color。 网上的资料,以及官方的资料都提到了如何设置单元格的颜色,但是极少有人分享如何读取单元格的字体颜色。 而 reddit 上的一个讨论甚至推荐换个库。。。 不得已,直接跪求 GPT-4o,果然立马解决。Google / Bing 搜索了半天,没有找到一个相关的资料,传 ...

阅读全文...

golang 对 word docx 文档中的占位符进行替换

选型问题 go 似乎还是少,python 的比较多。那我不如去看看 c# 和 python 的实现。我看最完善的是 java 的, 连模板编辑都有 golang docx 选型 https://github.com/nguyenthenguyen/docx 这个库只能对 docx 进行占位符替换。但是足够了。 来自这个项目的总结:https://github.com/fumiama/go-docx golang pdf 选型 https://github.com/signintech/pdft 但是这个库,是在指定坐标插入文本,并不能替换。 //insert text to pdf err = ...

阅读全文...

Golang Gorm 查询 SQL Server 数据库单条记录时报错: 在 FETCH 语句中选项 NEXT 的用法无效

用 Golang 的 Gorm ORM 库,总是有惊喜。这也是为何我一直想转投 ASP.NET EF Core 的原因。这个 Gorm 真的太山寨了。 今天在查询 SQL Server 数据库中的单条记录时,又出现了诡异的问题: mssql: 在 FETCH 语句中选项 NEXT 的用法无效。 这个错误对应的英文错误信息是: mssql: Invalid usage of the option NEXT in the FETCH statement. sql server 版本 版本号 sql server 11.0.2100,对应的版本是 SQL Server 2012 报错代码 ...

阅读全文...

[govet] misuse of unbuffered os.Signal channel as argument to signal.Notify

一段用于 gin gracefully shutdown 的代码在使用 govet 检查时,报 error 错误。 但是,这个错误在编译时,并不会报错,不影响编译,我就一直没管。 然而这个炎热的夏天,我实在忍不住了,今天在 VIM 中看到底部这个一直显示的,无法消除的 govet 错误,心情暴躁的我决定毁灭它。 报错信息 [govet] misuse of unbuffered os.Signal channel as argument to signal.Notify [Error] 报错代码 // Wait for interrupt signal to gracefully shut ...

阅读全文...

GORM 同时连接 MySQL 和 SQL Server 两种数据库

在实现一个公司内部的质量管理平台 (使用 MySQL 数据库),需要从原有的集采平台 (基于 SQL Server) 中拉取待检验的数据。 为了快速上线,我继续沿用了最顺手的 golang gin & gorm 组合。 但是之前没有试过同时连接两个数据库的用法,而且是两种不同类型的数据库。于是测试了一下。 同时建立两个连接倒是没啥好说的,在原有的 MySQL 配置平级增加一个 MS SQL 的就可以。但是小问题不少。 TLS Handshake failed 建立 SQL Server 连接失败,报错: TLS Handshake failed: tls: server select ...

阅读全文...

将 Golang 代码自动转换成 c/c++ 的方案选型

需求来源 因为最近一直在写 Android 蓝牙相关的 App,但是我发现 Kotlin 这门语言来操作字节流很不方便。 比如 CRC/BCC 校验,双字节转换 int16 都不方便。 而且之前还有微信小程序的蓝牙处理逻辑用 js 写的,连 js 都比 kotlin 操作字节流方便。但是也很麻烦。 远不如 c/c++ 代码直观。再就是我还有一套蓝牙网关直连服务器 golang 服务端的一套代码。 需要同时维护三套不同语言的代码,实现同一个逻辑,维护成本很高,而且没有意义。kotlin 和 js 这两个语言实在没有深究的兴趣。 于是我想,是否可以把蓝牙数据包的逻辑改用 c/c++ 编写,然后 ...

阅读全文...

golang gin graceful shutdown

在做一个微信支付的流程,担心经常更新程序导致服务中断,影响退款等逻辑,所以想加上 graceful shutdown 功能。 参考 Golang Gin 官方文档: https://gin-gonic.com/docs/examples/graceful-restart-or-stop/ 使用 Go 1.8 之后内置的 http.Server Shutdown() 方法,以实现 graceful shutdowns。 测试 // 测试 graceful shutdown // /api/testSleep?duration=20s func TestSleep(c *gin.Context) ...

阅读全文...

gorm preload 限制 field 字段

例如,我想用 golang gorm 查询订单表中关联的代理商名称,但是用 Gorm Preload 又会将代理商信息中多余的敏感信息取出来, 例如联系人等信息。于是就需要限制 Preload 的返回字段。 Models type Order struct { gorm.Model AgentId int // 代理商 id Agent Agent // 代理商信息 Status int } type Agent struct { gorm.Model Name string // 代理 ...

阅读全文...

Gorm select 表里所有数据包括已经软删除的数据

又写了一天的 bug ... 被 ORM 折腾死。 没关系,又活了一天,已经很厉害了。。。 Bug 的根源 一个设备信息管理系统的表,里面会自动给设备生成设备 ID。 格式: 前6位为生产如期,如:211207,代表 2021年12月7日生产。 后3位为生产编号,如:001,代表当日生产的第一台设备。 编号的生成逻辑: sql like 取最新的一条 满足 211207 的记录,如果有,就判断最后三位 + 1 没有,就生成一条 001 这个逻辑跑了很久都没有出问题,但是今天在写一个新系统时,我偷懒 copy 过来了。 然后,另一个 bug 导致几条设备信息被软删除 (gorm 默认是使 ...

阅读全文...

swaggo 通过 tag 限制生成接口文档的范围

这个周都在写 swaggo 接口文档,起因是要迁移一个旧的 golang gin 后台接口服务,新的系统只需要用到部分原有系统的接口。 但是,为了预防未来可能功能扩展,还是想继续保留原有系统的接口文档,不做删除处理。 那么,在用 swaggo 生成接口文档的时候,就出现了问题。如何屏蔽掉不需要的接口文档? 看起来很简单,直接用 exclude 参数不就行了?实际测试,这个 exclude 参数只支持目录,不支持具体文件,虽然 帮助文档里写是支持具体文件,但是即便更新了最新版本的 swaggo,也是不生效。 后来发现新版本支持了 tags 来指定生成文档。这就满足需求了,而且 tag 控制精度比 ...

阅读全文...