首页>>后端>>Golang->Go开发技巧和踩坑分享

Go开发技巧和踩坑分享

时间:2023-12-02 本站 点击:0

之前整理了一篇 Go语言中比较优雅的写法 已经收到了60+点赞,1万+的阅读。

这篇文章作为补充篇,分享一下最近使用GoFrame开发go项目的经验分享。

统一代码结构顺序

在同一文件中,如果存在类型(结构体)、常量、变量、方法(公共/私有)定义的时候,最好按照以下顺序组织代码结构,以方便维护:

类型定义(结构体定义)

常量定义

变量定义

方法定义(公共)

方法定义(私有)

例如:

// 类型定义type Xxx struct {}// 常量定义const (    internalConstName = "xxx")// 变量定义var (    internalVariable = "xxx")// 方法定义(公开)func GetXxx() {}// 方法定义(私有)func doGetXxx() {}

不要问我为什么?在团队开发中一定要有统一的规范,方便大家更好的理解代码,降低理解成本。

配置文件的管理

goframe建议大家使用配置文件,以便区分不同的运行环境连接不同的DB、CACHE、NSQ、三方的AKSK等配置信息。

这些配置文件一定是要加到gitignore中的,避免导致运行环境的混乱。

当我们有修改配置文件时,一定要记得同步修改多个环境的配置文件,避免导致未知问题。

当排查业务逻辑拍查不到原因时,想想是不是忘记修改了配置文件,这虽然是个低级错误,但确实坑了不少人。

尤其当遇到了本地环境运行正常,但是测试环境或者生产环境运行异常,且代码完全一致。首先排查机器是否正常,机器运行状态没问题后马上排查一下是不是配置文件不一致。

调试技巧

我习惯在项目中搞一个test文件,进行功能测试。

绑定cmd

首先,在main.go中绑定gcmd,允许通过cmd运行test文件

package mainimport (   "github.com/gogf/gf/os/gcmd"   "myApp/app/test")func main() {    .    .    .   _ = gcmd.BindHandle("test", test.Run) //调试脚本统一写在这里 避免混淆   _ = gcmd.AutoRun()}

test文件

package testfunc Run() {   testDemo()}func testDemo() {   //这是结构体   var req *notify.NotifyServer    //这是json   jsonInput := `{"msg_type":x,"source":x,"msg_send_time":x,"msg_data":{"xx":"xxxxxxx"}}`   //把json转成结构体   err := gconv.Struct(jsonInput, &req)   if err != nil {      logs.Info("test", "转换错误:%v", err)   }   g.Dump("req:", req)   _ = f.StatusComfirm(context.Background(), req)}

运行cmd

通过下述命令启动测试文件

go run main.go test

这样做的好处至少有2点:

不需要借助postman或者apipost就能调试自己的项目

当然我们也可以直接写到脚本文件中,但是那样做可能会和正常的脚本逻辑混淆。我们把需要进行测试的功能写到test中,能够避免歧义,降低团队的理解成本。

元数据 gmeta

作用:

主要用于嵌入到用户自定义的结构体中,比如声明对应的数据库

通过标签的形式给gmeta包的结构体打上自定义的标签内容,在运行时可通过Data/Get方法获取这些自定义的标签内容

package mainimport (   "fmt"   "github.com/gogf/gf/util/gmeta")func main() {   type User struct {      gmeta.Meta `orm:"user" db:"mysql"`      Id         int      Name       string   }   //通过Data获得结构体中的gmeta元数据标签,返回map类型   fmt.Println(gmeta.Data(User{})) //map[db:mysql orm:user]   //获得gmeta元数据标签的特定值   fmt.Println("orm:", gmeta.Get(User{}, "orm")) //orm: user}

打印结果

map[db:mysql orm:user]orm: user

在项目中如果有类似需求,那么gmeta是个非常不错的选择。

最后

感谢阅读,欢迎大家三连:点赞、收藏、投币(关注)!!!

原文:https://juejin.cn/post/7102605823003590692


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:/Golang/10059.html