写点什么

通过实战总结的 使用 Go 的小技巧

作者:王中阳Go
  • 2022-11-22
    北京
  • 本文字数:1790 字

    阅读完需:约 6 分钟

通过实战总结的 使用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」:https://goframe.org/pages/viewpage.action?pageId=1114326


「模型关联-静态关联-With 特性」:https://goframe.org/pages/viewpage.action?pageId=7297190


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

添加数据

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 后手动敲脚本。


配置方式如下:



配置文件链接:https://goframe.org/pages/viewpage.action?pageId=49770772&preview=/49770772/49770777/watchers.xml


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


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

总结

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


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

一起学习,互相督促

欢迎和我们一起学编程,坚持打卡,互相监督。


可以通过下面「作者栏」的信息联系我加群,一起学习。

发布于: 2022-11-22阅读数: 38
用户头像

王中阳Go

关注

靠敲代码在北京买房的程序员 2022-10-09 加入

公众号:程序员升级打怪之旅👍微信:wangzhongyang1993👍InfoQ优质创作者👍掘金签约作者👍B站&掘金&CSDN&思否等全平台账号:王中阳Go

评论 (1 条评论)

发布
用户头像
有朋友问我能不能搞一个GoFrame技巧篇,让新手少踩坑的那种。今天他来了!纸上得来终觉浅,觉知此事要躬行。编程是一门手艺活,一定多动手,重实践,才能获得长足的进步。
2022-11-22 09:51 · 北京
回复
没有更多了
通过实战总结的 使用Go的小技巧_Go_王中阳Go_InfoQ写作社区