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

polarisxu

共 1975字,需浏览 4分钟

 ·

2021-04-27 02:41

阅读本文大概需要 4 分钟。

大家好,我是站长 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 {11}

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

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,发现好项目~




往期推荐



我是 polarisxu,北大硕士毕业,曾在 360 等知名互联网公司工作,10多年技术研发与架构经验!2012 年接触 Go 语言并创建了 Go 语言中文网!


坚持输出技术(包括 Go、Rust 等技术)、职场心得和创业感悟!欢迎关注「polarisxu」一起成长!

浏览 10
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报