出发:Golang代码组织

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相关的环境变量,您过去需要设置其中的许多变量(例如GOOSGOARCH )。 现在,它们是可选的,除非您确实需要(例如,在交叉编译时),否则您不要弄乱它们。 要查看所有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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值