通过实战总结的 Go语言小技巧

简介: GoFrame技巧篇

gf gen dao

生成dao层的脚手架工具很好用,我遇到的坑是这样的:

生成的dao文件和同事们的不一致,生成文件成功,但是对应的Columns方法是空的。虽然有这个方法,但是方法内没有值。我的版本比同事们的略高,我一直以为是这个原因,各种降级和同事保持一致的版本后还是不行。

最终发现:是配置文件中连接的数据库不对。

因为没有连接到数据库,所以取不到列值;但是因为配置文件中约定了表名,文件正常生成了。

如果你也遇到了类似问题,去排查一下配置文件吧。

设置参数可传可不传

这个场景和是否使用GoFrame框架没关系,如果你也需要设置这个参数可传可不传,也能这么搞:

使用 ...interface{}

比如:

func GetXxx(xxx ...interface{}) { }

model作为结构体类型

当我们的业务比较复杂,需要更新多个关联表时,可以把需要修改的表统一定义到一个结构体中,而不是想到一个model处理一个model。

这种思想比较好,把关联的model统一封装到一个结构体中,很清晰,也能避免有遗漏。

type GoodsRelevantItem struct {
   Shop        *model.Shops
   Brand       *model.GoodsBrand
   Desc        *model.GoodsDescription
   Cover       []*model.GoodsCover
   Attributes  []*model.GoodsAttributes
   Goods       *model.Goods
   DisCategory []*model.DisCategory
}

模型关联

关于模型关联,官方是这么说的:

GoFrame的ORM没有采用其他ORM常见的BelongsTo, HasOne, HasMany, ManyToMany这样的模型关联设计,这样的关联关系维护较繁琐,例如外键约束、额外的标签备注等,对开发者有一定的心智负担。 因此gf框架不倾向于通过向模型结构体中注入过多复杂的标签内容、关联属性或方法,并一如既往地尝试着简化设计,目标是使得模型关联查询尽可能得易于理解、使用便捷。

我也花时间整理了自己在项目中的示例,但是发现自己整理的例子没有官网的好理解,所以最终我还是把自己的例子删掉了。

「模型关联」这部分比较硬核且实用,但是也确实有理解成本。

大家还是看官方示例吧:

「模型关联-动态关联-ScanList」:goframe.org/pages/viewp…

「模型关联-静态关联-With特性」:goframe.org/pages/viewp…

我也会把官方示例放到阅读原文中,方便大家去查看。

添加数据

goframe非常灵活,插入的数据可以是结构体也可以是map,也可以是map类型的切片,来实现批量添加。

举个栗子:

主程序如下:

//主图轮播
goodsImgs := []map[string]interface{}{} //图片集
for k, img := range gomeGoods.MainImgs {
   goodsImg := map[string]interface{}{} //图片
   goodsImg["cover"] = "http:" + img
   goodsImg["goods_id"] = gconv.Int(goodsDetail["goods_id"])
   goodsImg["sort"] = k
   goodsImgs = append(goodsImgs, goodsImg)
}
//添加主图
err = m.AddGoodsCover(ctx, tx, goodsImgs)
if err != nil {
   err = errors.New("添加商品主图失败")
   return err, 0
}

gomeGoods.MainImgs的定义:

MainImgs []string `json:"mainImgs"`

批量插入数据

batch指定了批量插入时一次插入的条数

func (m *goodsMessageService) AddGoodsCover(ctx context.Context, tx *gdb.TX, goodsImgs g.List) (err error) {
   if len(goodsImgs) == 0 {
      return errors.New("暂无数据")
   }
   _, err = dao.GoodsCover.TX(tx).Ctx(ctx).Batch(len(goodsImgs)).Insert(goodsImgs)
   checkErr(err, "UpdateGoodsCover")
   return
}

配置插件自动生成service

如果你在用goframe V2.1 以上版本,生成service强烈建议配置goland插件,而不是每次修改logic后手动敲脚本。

配置方式如下:

e71acf8771b628f2cc225dfa5eb555a.png

配置文件链接:goframe.org/pages/viewp…

当自动生成的文件报错,或者出现一些“神奇的问题”,建议把生成的文件删除掉。在对应的logic代码空白处随便敲个回车或者空格就能生成新的service文件。

注意:千万不要手动修改自动生成的代码。(因为自己修改的代码后期肯定会被覆盖掉)

总结

纸上得来终觉浅,觉知此事要躬行。

编程是一门手艺活,一定多动手,重实践,才能获得长足的进步。


公众号:程序员升职加薪之旅

微信号:wangzhongyang1993

B站视频:王中阳Go

相关文章
|
6月前
|
Linux Go iOS开发
Go语言100个实战案例-进阶与部署篇:使用Go打包生成可执行文件
本文详解Go语言打包与跨平台编译技巧,涵盖`go build`命令、多平台构建、二进制优化及资源嵌入(embed),助你将项目编译为无依赖的独立可执行文件,轻松实现高效分发与部署。
1022 162
|
6月前
|
存储 前端开发 JavaScript
Go语言实战案例-项目实战篇:编写一个轻量级在线聊天室
本文介绍如何用Go语言从零实现一个轻量级在线聊天室,基于WebSocket实现实时通信,支持多人消息广播。涵盖前后端开发、技术选型与功能扩展,助你掌握Go高并发与实时通信核心技术。
762 158
|
7月前
|
数据采集 数据挖掘 测试技术
Go与Python爬虫实战对比:从开发效率到性能瓶颈的深度解析
本文对比了Python与Go在爬虫开发中的特点。Python凭借Scrapy等框架在开发效率和易用性上占优,适合快速开发与中小型项目;而Go凭借高并发和高性能优势,适用于大规模、长期运行的爬虫服务。文章通过代码示例和性能测试,分析了两者在并发能力、错误处理、部署维护等方面的差异,并探讨了未来融合发展的趋势。
647 0
|
5月前
|
存储 安全 Java
【Golang】(4)Go里面的指针如何?函数与方法怎么不一样?带你了解Go不同于其他高级语言的语法
结构体可以存储一组不同类型的数据,是一种符合类型。Go抛弃了类与继承,同时也抛弃了构造方法,刻意弱化了面向对象的功能,Go并非是一个传统OOP的语言,但是Go依旧有着OOP的影子,通过结构体和方法也可以模拟出一个类。
301 1
|
7月前
|
负载均衡 监控 Java
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
在微服务架构中,高可用与稳定性至关重要。本文详解熔断、限流与负载均衡三大关键技术,结合API网关与Hystrix-Go实战,帮助构建健壮、弹性的微服务系统。
708 1
微服务稳定性三板斧:熔断、限流与负载均衡全面解析(附 Hystrix-Go 实战代码)
|
7月前
|
Cloud Native 安全 Java
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
436 1
|
7月前
|
Cloud Native Go API
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
492 0
|
7月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
333 0
|
7月前
|
Cloud Native Java 中间件
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
370 0
|
7月前
|
Cloud Native Java Go
Go:为云原生而生的高效语言
Go:为云原生而生的高效语言
414 0