在这篇文章中,我想根据我过去几年写go的经验,介绍三个go最佳实践。
简要:
-
什么是 "最佳 "做法?
-
实践1:package布局
-
实践2:熟悉context.Context
-
实践3:了解TDD(表格驱动方法)
-
去尝试吧!
什么是 "最佳 "做法?
有很多做法:你可以自己想出来,在互联网上找到,或者从其他语言中拿来,但由于其主观性,并不总是容易说哪一个比另一个好。”最佳”的含义因人而异,也取决于其背景,例如网络应用的最佳实践可能与中间件的最佳实践不一样。
为了写这篇文章,我带着一个问题看了go的实践,那就是 "它在多大程度上让我对写Go感到舒服?",当我说"语言的最佳实践是什么?"时,那是在我刚接触这门语言,还没有完全适应写这门语言的时候。
当然,还有更多的做法,我在这里不做介绍,但如果你在写go时知道这些做法,就会非常有用,但这三个做法对我在go中的信心影响最大。
这就是我选择"最佳"做法的原因。现在是该上手的时候了。
实践1:package布局
当我开始学习go时,最令人惊讶的事情之一是,go没有像Laravel对PHP,Express对Node那样的网络框架。这意味着在编写网络应用时,如何组织你的代码和包,完全取决于你。虽然在如何组织代码方面拥有自由是一件好事,但如果没有指导原则,很容易迷失方向。
另外,这也是最难达成一致的话题之一;"最佳 "的含义很容易改变,这取决于程序处理的业务逻辑或代码库的大小/成熟度。即使是同一个代码库,当前的软件包组织在6个月后也可能不是最好的。
虽然没有单一的做法可以统治一切,但为了补救这种情况,我将介绍一些准则,希望它们能使决策过程更容易。
准则1:从平面布局开始
除非你知道代码库会很大,并且需要某种预先的包布局,否则最好从平面布局开始,简单地将所有的go文件放在根文件夹中。
这是一个来自github.com/patrickmn/g…软件包的文件结构。
❯ tree . ├── CONTRIBUTORS ├── LICENSE ├── README.md ├── cache.go ├── cache_test.go ├── sharded.go └── sharded_test.go 复制代码
它只有一个领域的关注:对数据缓存,对于像这样的包,甚至不需要包的布局。扁平结构在这种情况下最适合。
但随着代码库的增长,根文件夹会变得很忙,你会开始觉得扁平结构不再是最好的了。是时候把一些文件移到它们自己的包里了。
准则2:创建子包
据我所知,主要有三种模式:直接在根部,在pkg文件夹下,以及在internal文件夹下。
在根部
在根目录下创建一个带有软件包名称的文件夹,并将所有相关文件移到该文件夹下。这样做的好处是:
-
没有深层次/嵌套的目录
-
导入路径不杂乱
缺点是根文件夹会变得有点乱,特别是当有其他文件夹如scripts、bin和docs时。
在pkg包下
创建一个名为pkg的目录,把子包放在它下面。好的方面是:
-
这个名字清楚地表明这个目录包含了子包
-
你可以保持顶层的清洁
而不好的方面是你需要在导入路径中有pkg,这并不意味着什么,因为很明显你在导入包。
然而,这种模式有一个更大的问题,也是前一种模式的问题:有可能从版本库外部访问子包。
这对私人仓库来说是可以接受的,因为如果发生这种情况,在审查过程中会被注意到,但重要的是要注意什么是公开的,特别是在开放源码的背景下,向后兼容性很重要。一旦你把它公开,你就不能轻易改变它。
有第三个选择来处理这种情况。