golang

分类下相关文章

golang gin 项目代码组织结构能否像 python django 一样清晰

现有的组织结构 现在使用的 golang gin 的代码组织结构是延续了之前使用 php laravel 的组织方式, 主要目录包括: models controllers views / templates public 每个目录下都是一堆堆的 go 文件,例如 controllers 下是 user.go, article.go 等。 现有结构的弊端 现有组织结构用了快两年,经历的 gin 项目多了之后,弊端就逐渐显露了出来。例如: 所有 controllers 都在一个 package 内,就算是我一个人开发、维护,都很容易出现全局变量重名的情况。不得已就得加前缀,但是这样就增加了 ...

阅读全文...

golang fmt.Sprintf 中 %d 与 %s 混用会怎样

写了一个后台分页的 bug,问题的原因在 fmt.Sprintf 中我将 int 类型传递给了 %s。 有问题的代码 categoryId := 5 if categoryId > 0 { url += fmt.Sprintf("?category=%s", categoryId) } 其输出是: /solutions?category=%!s(int=5) 导致之后的参数解析逻辑没有正常执行。 而且这个 bug 具有隐蔽性,从打印日志输出看,我看了半天也没有发现这是一个错误的输出。 后来看 golang fmt 的文档,才知道这是错误信息。 Format ...

阅读全文...

golang 生成文章简介

主要是为了用 golang 生成文章简介,及 html description 标签的内容。 逻辑 去除 html tag 取前 N 个字符 (160 个字母,或 80 个中文字符) HTML StripTags for Go, 去除 HTML 标签 https://github.com/grokify/html-strip-tags-go go get github.com/grokify/html-strip-tags-go 使用方法 import( strip "github.com/grokify/html-strip-tags-go" ) fun ...

阅读全文...

Golang 后台模板分页组件,基于 Tailwind CSS

为何不适用基于 Javascript 的分页组件 For SEO. 写 Web 就是为了能被用户搜素到,如果不是为了这个目的,web 版本都没有存在的价值。 而分页导航又是被搜索引擎收录的关键,所以一定要在后台进行渲染,不要使用 Javascript。 后台模板实现 现在来看,Laravel Django 这类框架还是比 gin 爽,毕竟内置了分页组件。 可以参考这个封装,顺便学习一些 template html 库的使用。 https://github.com/AndyEverLie/go-pagination-bootstrap 封装的很好,复用性很强。但是需要改造的地方。 TODO [ ...

阅读全文...

Golang Gorm Sum decimal 字段类型

感觉是 Gorm 的 Bug,在使用 Pluck 获取 Sum 结果时总是报错。 而用 Scan 就没有问题。 可行的做法 Scan type FHSum struct { Total float64 } var total FHSum db.Select("sum(money) as total").Scan(&total) 这样能获取到 sum 的结果。 Pluck float64 报错 var total []float64 // slice 的第一个数字就是 sum 值 db.Select("sum(money) as total&quot ...

阅读全文...

Go 1.18 版本新特性,及升级步骤

今年 315 唯一的好消息是,Golang 1.18 版本发布。 新特性 支持泛型 Generics 模糊测试 Fuzzing Workspaces 性能提升 20%。但是由于支持了泛型,编译时间比 1.17 慢 15%。 详见:https://go.dev/blog/go1.18 总体而言,新特性,我个人基本用不上。。。我果然是一个不合格的 CRUD 程序员。 泛型 Generics golang 官方文档介绍得通俗易懂,不需要过多解释。 https://go.dev/doc/tutorial/generics 可惜,我至今所有语言都没用过泛型这个特性。 模糊测试 Fuzzing 使用随 ...

阅读全文...

golang gorm 的多对多关系 CRUD 操作

例如,一个财务预算管理系统,需要能设置各部门的负责人,以方便控制查看权限。 而且可以一个部门设置多个负责人。 golang gorm 的数据结构 因为我独立建了个关系表,兼容出现多对多的关系,所以用到了 gorm many2many: type Department struct { Id int `json:"id"` Name string `json:"name"` Managers []User `gorm:"many2many:department_manager;"` Mana ...

阅读全文...

Golang 使用 sql.NullString 替代 string 类型,避免空字符串引起的唯一索引报错

例如: 用户表的用户名字段为可 Null 字段,但是如果在 golang struct 中定义为 string,则在保存时,不指定值,会默认存入空字符串。 正常情况下并没有什么影响,但是如果恰好这个字段上建了唯一索引。那么非 Null 值都必须保证唯一性。就会造成运行时异常了。 此时,需要将该字段定义为 sql.NullString import ( "database/sql" ) type User struct { gorm.Model Name sql.NullString } // 新建一个用户 models.DB.Where(models.User{ ...

阅读全文...

Golang Gorm 数据插入 MySQL 失败 Error 1054: Unknown column 'xx' in 'field list'

原因是,我 Struct 中定义了一个新字段,为了方便在接口返回数据时,能补充一个数据库中没有的信息。 这导致在 Gorm 插入 MySQL 时报错,提示未知字段错误。 插入时,忽略指定字段 查了一下,发现 Gorm 有个字段标签的功能,可以方便的忽略特定字段: https://gorm.io/zh_CN/docs/models.html#%E5%AD%97%E6%AE%B5%E6%A0%87%E7%AD%BE - 忽略该字段,- 无读写权限 甚至可以更细分的控制,读和写分别设置是否忽略。 例如: type User struct { Name string `gorm:"-& ...

阅读全文...

sql.NullTime 计算时间差

定了一个类型,实际上是 sql.NullTime。我想计算当前时间与其值的时间差。 type NullTime struct { sql.NullTime } sql.NullTime https://pkg.go.dev/database/sql#NullTime type NullTime struct { Time time.Time Valid bool // Valid is true if Time is not NULL } NullTime 实际上是个 struct,时间值存储在 Time 字段中。 time.Time 如何计算时间差 https://stackov ...

阅读全文...

为 golang 项目添加 Makefile

使用 Makefile 的好处 可以管理多个任务的命令。例如,build & run,test。 否则单单一个 go test -v ./... 就很难记住。 何况还会有很多需要记录的命令: go test build & run scp 到服务器,并重启服务 每个功能一个 shell 脚本,会显得很杂乱。放到一个统一的文件中,就非常方便了。 如果没有 Makefile 文件会怎样 > make make: *** No targets specified and no makefile found. Stop. 参考项目 golang gin 项目的 Make ...

阅读全文...

golang gorm 2 中使用 lock for update 锁

查了一下 golang gorm 2 确实支持 lock for update。文档: https://gorm.io/zh_CN/docs/advanced_query.html#Locking-FOR-UPDATE db.Clauses(clause.Locking{Strength: "UPDATE"}).Find(&users) 但由于 for update 必须在事务中使用,所以,还需要看看 gorm 事务的写法。 lock for update 与 share 的区别 参考 使用 Laravel sharedLock 与 lockForUpdate 进 ...

阅读全文...

Golang Gorm Error 1292: Incorrect datetime value: '0000-00-00' for column

报错内容 在用 Golang Gorm 更新 MySQL 一条数据时,报错: Error 1292: Incorrect datetime value: '0000-00-00' for column 'created_at' at row 1 UPDATE `repair` SET `created_at`='0000-00-00 00:00:00',`updated_at`='2021-06-03 17:03:31.359' WHERE `id` = 2 报错代码 我是将 Antd Pro Web 管理后台的数据通过 API 接口发送给后台 Golang 接口,进行更新。 由于前端不需要 ...

阅读全文...

Goland Gin 将上传的图片文件转存到七牛 CDN

安装七牛 golang sdk go get -u github.com/qiniu/go-sdk/v7 go get github.com/qiniu/go-sdk/v7/storage@v7.9.5 参考七牛官方文档: https://developer.qiniu.com/kodo/sdk/go zone 的可选值 参考这里 https://github.com/qiniu/go-sdk/blob/master/storage/zone.go 上传七牛 前端看到的上传格式: Content-Disposition: form-data; name="file"; f ...

阅读全文...

golang 生成 UUID

实现 golang 向七牛云 CDN 上传图片文件的功能,需要为图片生成一个唯一的文件名, 所以找了一下 Golang 生成 UUID 的实现。 安装依赖 go get github.com/google/uuid 使用方法 import "github.com/google/uuid" uuid := uuid.New() key := uuid.String() 生成的 UUID 数据格式 4738c1d9-04ce-46a5-a49f-7cc2b9f061e2 官方文档 https://pkg.go.dev/github.com/google/uuid ...

阅读全文...