Go 语言一些最佳实践:建议收藏

polaris · 2021-04-26 21:00:45 · 4641 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-04-26 21:00:45 的主题,其中的信息可能已经有所发展或是发生改变。

大家好,我是站长 polarisxu。

看到一个 GitHub 项目,专门总结 Go 语言的一些建议或最佳实践。这些建议不一定全部适合你,但很多时候是值得借鉴或参考的。

这份 go-advice 包括以下几个部分:

  • Go 箴言
  • Go 之禅
  • 代码
  • 并发
  • 性能
  • 模块
  • 构建
  • 测试
  • 工具
  • Misc

其中,第一部分和第二部分,分别来自 Rob Pike 和 Dave Cheney。

项目地址:https://github.com/cristaloleg/go-advice,还有中文版:https://github.com/cristaloleg/go-advice/blob/master/README_ZH.md

我们看几个「代码」部分的实践或建议。

01 格式化

这个相信很多人已经养成习惯了,而且一般 IDE 会自动做这件事。go fmt:这是 Go 爱好者喜欢的功能之一。团队中,可以为 git 创建钩子或在 CI/CD 系统中自动执行 go fmt,当然最好是每个人养成这样的习惯,比如强制要求编辑器配置上自动 go fmt。

02 使用语义明确的表示

很多时候,不同的代码能表示相同的意思。但代码应该是写给人阅读的,只是偶尔被机器执行一下。因此,阅读性应该提到一个更高的要求。这个项目对此作了一些建议,让你在写出的代码更可读。

  • 用 chan struct{} 来传递信号,chan bool 表达的不够清楚
  • 30 time.Second 比 time.Duration(30) time.Second 更好
  • 用 time.Duration 代替 int64 + 变量名
  • 不要依赖于计算顺序,特别是在 return 语句中
  • 。。。

03 一些小技巧

有时候,为了代码更可读或为了一致性,亦或是避免一些潜在的问题发生,我们会在团队做相关的代码风格规定。除了规定,如果你写的代码,希望使用者能够更规范的用,有些地方可以使用一些技巧。

防止结构体字段用纯值方式初始化,添加 _ struct {} 字段

我们知道,结构体初始化时,可以用纯值初始化。比如:

type Point struct {
  X, Y float64
}

可以如下两种方式初始化:

Point {X:1,Y:1}
Point {1, 1}

很显然,第一种方式可读性更好。如果你希望限制只能第一种方式,可以这么做:

type Point struct {
    _    struct{}
    X, Y float64
}

go-advice 项目中把 _ struct{} 放在了结构体最后,这会让结构体的空间增加,而放在开始却不会增加。即

type Point struct {
    _    struct{}
    X, Y float64
}

type Point struct {
    X, Y float64
    _    struct{}
}

的空间占用是不一样的,你知道为什么吗?

所以,对每个建议,我们应该认真审视,而不是人为这上面说的就一定对。

JavaScript 解析整数为浮点数并且你的 int64 可能溢出

这个问题很多人可能会遇到。可以试试加上这个 tag:json:"id:string"

type Request struct {
  ID int64 `json:"id,string"`
}

04 总结

这个项目提到的很多建议或实践,认真阅读,同时审视下自己是怎么做的,它的建议是否合理?!好的地方,不防借鉴下。

建议可以多逛逛 GitHub,发现好项目~


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

4641 次点击  ∙  2 赞  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传