0

Golang FAQ

 2 years ago
source link: https://yanhang.me/post/2019-07-19-golang-faq/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Golang FAQ 是一篇比较好的关于 Golang 设计的文档。比较琐碎,但是解释了很多 Golang 设计的权衡之处。没有语言是完美的,从工业界来看,Golang 是一种流行的,成功的编程语言。从语言设计来看,当然仍有欠缺与不足之处。许式伟是前者的角度,王垠是后者的角度。当然除了宏观层面,FAQ 文档仍然提供了很多有趣的细节。

文档的可得性

所有的语言都知道支持文档。但可得性是一个更重要的维度。 Python 有 PEP 系列详细解释了语言设计的细节, 有 read the docs 系统为各种 library 提供用户文档。 Golang有 godoc 工具以及 Golang blog, 还有像 FAQ 这样的设计 detail 解释。二者在此方面都是做的比较优秀的,也在一定程度上促进了语言的流行。

语言设计细节

可读性一方面是要考虑尽量贴近大部分程序员的背景以及知识结构,另一个方面语言的设定要尽量 common, 不会让人需要额外思考来确定一个语法的语义。Golang 对于大部分具有 c / python 等背景的程序员来说非常易懂,也尽量控制新的语法的数量,所以能够迅速的大范围的流行起来。

另一方面,为了语言的可维护性,去掉一些便捷的语法糖也是一个重要的考量。Golang 去掉了 ?: , 隐式类型转换,指针操作,Goroutine 的内部结构不对外暴露等等。虽然代码不会像 python 那样简短,但在可维护性以及稳定性上都有了改善。

Generic types

泛型的缺乏是 Golang 广受批评的一个点。Golang 在初期为了语言的可读性以及可维护性舍弃了泛型,而且从使用角度来看,范型并不是缺少了就无法写出拥有良好结构的代码。当然现在语言发展到成熟期,泛型的加入仍是值得考虑的。

Error 与 Exception

这两个东西只能说目前都没有完美的实现,各有各的问题。 Golang 选择了贴近于 C 语言的 error 形态,也一定程度上是为了语言结构的清晰性。

assertions

在语言层面去掉 assert 是比较好的,因为它的使用场景主要是程序员的偷懒。但是在 test 部分仍然不提供 assert 有点说不过去。目前有很多第三方的实现。

static link

虽然产生的 binary size 比较大,但是却正好和 Docker 成了好搭档。什么依赖都不需要 os 干涉,甚至直接从一个空的 base image 添加 go binary 也是可以执行的。

unused imports

尤其是在使用 Goland 的 auto-format 之类的特性时,再加上 import 时, 因为名称冲突必须使用 alias 的场景下,有时候加入一个 import 语句是一件挺麻烦的事。这种情况下,在代码修改或者重构时保留那些 unused imports 还是挺有用的,用如下的代码可以保留住这些 imports:

import "unused"

// This declaration marks the import as used by referencing an
// item from the package.
var _ = unused.Item  // TODO: Delete before committing!

func main() {
    debugData := debug.Profile()
    _ = debugData // Used only during debugging.
    ....
}

Links


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK