7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Go

与Go同行:Golang代码组织

Scroll to top
Read Time: 3 mins

Chinese (Simplified) (中文(简体)) translation by Qiang Ji (you can also view the original English article)

Go在现代语言中是一种特别的语言。 它非常的固执己见。 比如,它只有一种真正的格式。 Go会告诉你如何分隔你的代码和在哪里摆放你的花括号。 但它不仅仅只有这些。

Go还会告诉你如何将你的函数和变量首字母大写,以使它们成为公共的或私有的函数或变量。 它将决定你代码的目录结构。 这可能会给那些从更自由的编程语言转到Go的开发者带来惊喜。

在这篇文章中,我将探讨一些Go的限制,讨论它们的优点,并为常见的状况建议一些选择。

Euler项目

当我开始学习Go时,我为第6个问题创建了一个解决方案,我就把它放在一个子目录中,就在那些用其他语言创建的,针对其他问题的解决方案的旁边。 参见Euler项目

问题是Go并不想让你到处随机地摆放Go文件。 我后来意识到(虽然这在非常简单的情况下比如你不导入其它包的时候是工作的)它是不正确的。

依赖

每个重要的程序都是由多个文件、模块、组件或类组成。 我就用“文件”作为一个通用的术语。 它们常常以库、包或程序集分组。 我就用“包”作为一种通用的术语。 你编写的代码依赖其它文件和包中的代码。

你需要告诉你的代码如何去找到这些包和文件以使用其功能。 每个语言都有它自己的术语:导入(import), 包含(include)和 需要(require). 我就用“导入(import)"作为一种通用的术语。

某些语言(或特定于语言的工具)还允许从远程软件包存储库安装依赖关系,并将它们安装到一个标准的本地位置,你可以从这些地方导入它们。

在大多数常见的编程语言中,你有很多的自由。 在C / C ++中,你可以告知编译器/链接器文件和静态库在哪里(使用命令行开关或环境变量,如INCLUDE_DIR)。 在Python中,你可以使用setup.py从PyPI或远程源代码控制库来安装软件包。 然后你可以根据sys.path包搜索路径导入。

Go的方式

Go,一如既往,更加的规范。 它可能冒犯了你的创造力,你不能想放在那里就放在那里,但最终这并没有那么重要,它能足够灵活地去适应各种情况。

Go要求你将代码放在工作区中。 工作区只是一个具有三个子目录的目录:src,pkg和bin。 它建议你将所有的项目保存在单个工作区下。 这样它们可以彼此依赖并共享通用的第三方包。

注意:我目前使用Windows和PowerShell来做许多的交互示例。 对于以下部分,我想使用tree命令显示我的工作区的目录结构。 Windows有自己的tree.exe命令,但它非常有限(无层级)。 据说在这里有一个成熟的可使用在Windows下的tree命令。

但这网站打不开。 我最终创建了一个运行Ubuntu的Docker容器,将我的Go工作区架设在路径/docs/Go,并使用Linux tree命令显示它。 所以不要困惑,如果你看到一个Linux环境显示Windows目录和.exe后缀的文件。

这里是我目前的Go工作区。 bin目录包含不同的Go命令/工具,和delve调试器。 pkg目录有一个带平台(Win 64)的子目录,该平台包含按代码库源(github.com,golang.com等)组织的包。 src目录有个与其原始代码库或网站(github.com,golang.org等)类似的子目录。

让我们来看看我在src下创建的一个源项目:go-web-crawler。 这里很简单:只是Go文件的简单列表,一个许可证和一个README文件。

GOROOT 和 GOPATH

两个环境变量控制你在GO领地的命运。 GOROOT就是Go被安装的地方。

注意,Go根目录看起来像是一个具有src,bin和pkg目录的工作区的超集。

GOPATH指向你的工作区。 这就是如何让Go找到你的代码。

还有一堆其它与Go相关的环境变量,在过去有许多需要你去设置(例如GOOSGOARCH)。 现在,它们是可选的,你不应该弄乱它们,除非你真的需要(例如,当交叉编译时)。 要查看所有Go环境变量,请输入:go env

安装和导入

当你创建一个Go程序或一个库时,你可以安装它们。 程序会被安装在你工作区的bin目录里,库会被安装在工作区的pkg目录里。 在Windows操作系统中,我发现你的%GOPATH%/bin不在%PATH%目录中,所以Windows操作系统找不到我的可执行文件。 我把它加入Windows操作系统的PATH后所有的东西都工作了。 这是是如何在PowerShell中检查是否你的PATH包含你工作区的bin目录。

让我们看一下它们在实际中的运用。

如果我进入go-web-crawler目录并且输入go install,那么go-web-crawler.exe会在c:\Users\the_g\Documents\Go\bin目录里被创建。

我现在能从任何地方运行我的Go网页爬虫。

多重Go环境

到目前为止这一切都很好,但有时候生活不是那么简单。 你也许想有多个单独的工作区。 此外,你也许想安装多个Go(例如不同的版本)和多个工作区。 你可以通过动态地设置GOPATH改变工作区和设置GOROOT改变活跃的Go安装来实现,

有各种开发,包管理和虚拟环境的开源项目。 由于某些原因,大多数不支持Windows操作系统。 我不知道为什么这样的工具必须是平台特定的。 某天,我可以自己写一个跨平台的Go环境管理器。

结论

Go的发明是有关消除偶然的复杂性。 有时它非常的严格和规范。 但是,如果你进入了Go设计师的心态,你开始明白,避免,禁止或强制某些事情真的使一切更简单。

关注我们的公众号
Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.