Go是现代语言中的一种特殊语言。 这是很自以为是的。 例如,有一种真正的格式。 Go会告诉您如何间隔代码以及将花括号放在何处。 但这远不止于此。
Go还将告诉您如何大写您的函数和变量以使其公开或私有。 它将决定代码的目录结构。 对于使用更加自由的编程语言来使用Go的开发人员而言,这可能令人感到意外。
在本文中,我将探讨Go的一些限制,讨论它们的优点,并为常见情况提供建议。
欧拉计划
当我开始学习Go时,我创建了问题6的解决方案,并将其放在子目录中,以及其他语言的其他问题的解决方案。 见欧拉计划 。
问题是Go不想让您随地分散Go文件。 后来我意识到,尽管在不导入其他软件包的非常简单的情况下它可以工作,但这是不合适的。
依存关系
每个不平凡的程序都由多个文件或模块或组件或类组成。 我将只使用“文件”作为通用术语。 它们通常分为库,程序包或程序集。 我将仅使用“包装”作为通用术语。 您编写的代码取决于其他文件和包中的代码。
您需要告诉您的代码如何找到那些软件包和文件,以便使用它们的功能。 每种语言都有其自己的术语:导入,包含,要求。 我将仅使用“导入”作为通用术语。
某些语言(或特定于语言的工具)还允许您从远程软件包存储库安装依赖项,并将其安装到可以从中导入的标准本地位置。
在大多数常见的编程语言中,您有很多自由。 在C / C ++中,您告诉编译器/链接器文件和静态库的位置(使用命令行开关或环境变量,例如INCLUDE_DIR)。 在Python中,您可以使用setup.py或PyPI和远程源代码控制存储库中的pip从PyPI安装软件包。 然后,您将基于sys.path包搜索路径导入。
走的路
一如既往,围棋更具规范性。 您可能不会冒充您在哪里放置东西的发言权,这可能会冒犯您的创造力,但归根结底这并不重要,并且有足够的灵活性来适应各种情况。
Go要求您将代码放在工作区中。 工作空间只是具有三个子目录的目录:src,pkg和bin。 建议您将所有项目都放在一个工作区中。 这样,他们可以相互依赖并共享通用的第三方程序包。
注意: 我目前在Windows上工作,并在许多交互式示例中使用PowerShell。 对于以下部分,我想使用tree
命令显示工作区的目录结构。 Windows有其自己的tree.exe命令,但功能非常有限(没有级别)。 据说 这里 有Windows的完整树命令 。
但是该站点无法访问。 我最终启动了一个运行Ubuntu的Docker容器,将我的Go工作区安装为/ docs / Go,并使用Linux树命令来显示它。 因此,如果您看到Linux环境显示带有.exe后缀的Windows目录和文件,请不要感到困惑。
这是我当前的Go工作区。 bin
目录包含各种Go命令/工具和delve调试器。 pkg
目录具有平台(Win 64)平台的子目录,该子目录包含按来源分组的软件包(github.com,golang.com等)。 src
目录具有与原始存储库或网站类似的子目录(github.com,golang.org等)。
root@67bd4824f9d5:/docs/Go# tree -n -L 3
|-- bin
| |-- dlv.exe
| |-- go-outline.exe
| |-- go-symbols.exe
| |-- gocode.exe
| |-- godef.exe
| |-- golint.exe
| |-- gometalinter.exe
| |-- gopkgs.exe
| |-- gorename.exe
| |-- goreturns.exe
| `-- guru.exe
|-- pkg
| `-- windows_amd64
| |-- github.com
| |-- golang.org
| |-- gopkg.in
| `-- sourcegraph.com
`-- src
|-- github.com
| |-- alecthomas
| |-- derekparker
| |-- go-web-crawler
| |-- golang
| |-- google
| |-- lukehoban
| |-- multi-git
| |-- newhook
| |-- nsf
| |-- rogpeppe
| |-- tpng
| `-- x
|-- golang.org
| `-- x
|-- gopkg.in
| `-- alecthomas
`-- sourcegraph.com
`-- sqs
27 directories, 11 files
让我们看一下我在src
下创建的一个源项目:go-web-crawler。 这很简单:只有一份Go文件,一个许可证和一个README文件列表。
root@67bd4824f9d5:/docs/Go# tree src/github.com/go-web-crawler/ -n
src/github.com/go-web-crawler/
|-- LICENSE
|-- README.md
|-- channel_crawl.go
|-- main.go
`-- sync_map_crawl.go
0 directories, 5 files
GOROOT和GOPATH
两个环境变量控制着Go的命运。 Go安装位置是GOROOT
:
09:21:26 C:\Users\the_g\Documents\Go> ls Env:\GOROOT
Name Value
---- -----
GOROOT C:\Go\
09:21:35 C:\Users\the_g\Documents\Go> ls c:\go
Directory: C:\go
Mode LastWriteTime Length Name
---- ------------- ------ ----
d----- 8/16/2016 10:38 AM api
d----- 8/16/2016 10:38 AM bin
d----- 8/16/2016 10:38 AM blog
d----- 8/16/2016 10:38 AM doc
d----- 8/16/2016 10:38 AM lib
d----- 8/16/2016 10:38 AM misc
d----- 8/16/2016 10:38 AM pkg
d----- 8/16/2016 10:38 AM src
d----- 8/16/2016 10:38 AM test
-a---- 8/16/2016 1:48 PM 29041 AUTHORS
-a---- 8/16/2016 1:48 PM 1168 CONTRIBUT
-a---- 8/16/2016 1:48 PM 40192 CONTRIBUT
-a---- 8/16/2016 1:48 PM 1150 favicon.i
-a---- 8/16/2016 1:48 PM 1479 LICENSE
-a---- 8/16/2016 1:48 PM 1303 PATENTS
-a---- 8/16/2016 1:48 PM 1638 README.md
-a---- 8/16/2016 1:48 PM 26 robots.tx
-a---- 8/16/2016 1:48 PM 5 VERSION
请注意,转到根目录看起来像是带有src,bin和pkg目录的工作区的超集。
GOPATH
指向您的工作区。 这就是Go查找代码的方式。
09:21:53 C:\Users\the_g\Documents\Go> ls Env:\GOPATH
Name Value
---- -----
GOPATH c:\Users\the_g\Documents\Go
还有很多其他与Go相关的环境变量,您过去需要设置其中的许多变量(例如GOOS
和GOARCH
)。 现在,它们是可选的,除非您确实需要(例如,在交叉编译时),否则您不要弄乱它们。 要查看所有Go环境变量,请输入: go env
。
09:51:10 C:\Users\the_g> go env
set GOARCH=amd64
set GOBIN=
set GOEXE=.exe
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOOS=windows
set GOPATH=c:\Users\the_g\Documents\Go
set GORACE=
set GOROOT=C:\Go
set GOTOOLDIR=C:\Go\pkg\tool\windows_amd64
set CC=gcc
set GOGCCFLAGS=-m64 -mthreads -fmessage-length=0
set CXX=g++
set CGO_ENABLED=1
安装和导入
创建Go程序或库时,可以安装它。 程序进入工作区的bin
目录,库进入工作区的pkg
目录。 在Windows上,我发现您的%GOPATH%/bin
不在%PATH%
目录中,因此Windows找不到我的可执行文件。 我将其添加到Windows PATH,一切正常。 以下是在PowerShell中检查您的PATH包含工作区bin目录的方法:
10:56:19 C:\Users\the_g> $env:path.split(";") | grep go
C:\Go\bin
c:\Users\the_g\Documents\Go\bin
让我们看看所有这些。
如果我转到go-web-crawler目录并键入go install
则会在c:\Users\the_g\Documents\Go\bin
创建go-web-crawler.exe:
11:09:18 C:\Users\the_g> ls $env:GOPATH/bin
Directory: C:\Users\the_g\Documents\Go\bin
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 8/15/2016 11:05 AM 15891456 dlv.exe
-a---- 8/15/2016 10:08 AM 3972608 go-outline.exe
-a---- 8/15/2016 10:10 AM 4502528 go-symbols.exe
-a---- 9/18/2016 10:14 AM 1849856 go-web-crawler.exe
-a---- 8/15/2016 10:08 AM 12097024 gocode.exe
-a---- 8/15/2016 10:17 AM 6642688 godef.exe
-a---- 8/15/2016 9:32 AM 6625792 golint.exe
-a---- 8/15/2016 10:14 AM 6352896 gometalinter.exe
-a---- 8/15/2016 10:10 AM 2738688 gopkgs.exe
-a---- 8/15/2016 10:10 AM 6961152 gorename.exe
-a---- 8/15/2016 10:09 AM 7291904 goreturns.exe
-a---- 8/15/2016 10:11 AM 9722368 guru.exe
现在,我可以从任何地方通过Go网络搜寻器运行它。
11:10:32 C:\Users\the_g> go-web-crawler.exe
found: http://golang.org/ "The Go Programming Language"
found: http://golang.org/cmd/ ""
not found: http://golang.org/cmd/
found: http://golang.org/pkg/ "Packages"
found: http://golang.org/pkg/os/ "Package os"
found: http://golang.org/pkg/fmt/ "Package fmt"
found: http://golang.org/ "The Go Programming Language"
多围棋环境
没关系,但是有时候生活并不那么简单。 您可能需要多个单独的工作区。 此外,您可能希望安装多个Go(例如不同版本),并为每个安装多个工作区。 您可以通过动态设置GOPATH
来更改工作区,并设置GOROOT
来更改活动的Go安装来做到这一点。
有各种用于供应商,程序包管理和虚拟环境的开源项目。 由于某些原因,大多数不支持Windows。 我不确定为什么这些工具必须是特定于平台的。 这些天之一,我可能会自己编写一个跨平台的Go环境经理。
结论
Go就是消除偶然的复杂性。 有时,它以非常严格和说明性的方式出现。 但是,如果您进入Go设计师的思维定势,您就会开始明白,避免,禁止或强制执行某些操作确实会使一切变得简单。
翻译自: https://code.tutsplus.com/tutorials/lets-go-golang-code-organization--cms-27368