前文
- golang快速入门[1]-go语言导论
- golang快速入门[2.1]-go语言开发环境配置-windows
- golang快速入门[2.2]-go语言开发环境配置-macOS
- golang快速入门[2.3]-go语言开发环境配置-linux
- golang快速入门[3]-go语言helloworld
- golang快速入门[4]-go语言如何编译为机器码
- golang快速入门[5.1]-go语言是如何运行的-链接器
- golang快速入门[5.2]-go语言是如何运行的-内存概述
- golang快速入门[5.3]-go语言是如何运行的-内存分配
- golang快速入门[6.1]-集成开发环境-goland详解
- golang快速入门[6.2]-集成开发环境-emacs详解
前言
- 在之前文章中,我们介绍了go语言开发环境的配置
- 在本章中,我们将介绍go语言的项目结构、项目管理以及依赖管理。在本文中,我们关注
gopath
gopath是什么
- 在go语言开发环境配置文章中,我们介绍了配置
gopath
与goroot
环境变量的步骤,但是并没有对其进行深入解释。可以在终端输入go env
或者go env gopath
查看具体的配置
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19C:Windowssystem32> go env set GO111MODULE= set GOARCH=amd64 set GOBIN= set GOCACHE=C:UsersjacksonAppDataLocalgo-build set GOENV=C:UsersjacksonAppDataRoaminggoenv set GOEXE=.exe set GOFLAGS= set GOHOSTARCH=amd64 set GOHOSTOS=windows set GONOPROXY= set GONOSUMDB= set GOOS=windows set GOPATH=C:Usersjacksongo set GOPRIVATE= set GOPROXY=https://proxy.golang.org,direct set GOROOT=c:go ...
- 在go1.8之后,如果不指定gopath,则gopath是默认的。
- 在mac,linux下为`$HOME/go`
- windows 下为`%USERPROFILE%go`
gopath
可以理解为go语言的工作空间,内部存储了src
,bin
,pkg
三个文件夹
复制代码
1
2
3
4
5go/ ├── bin ├── pkg └── src
$GOPATH/bin
目录存储了通过go install
安装的二进制文件。操作系统使用$PATH环境变量来查找无完整路径即可执行的二进制应用程序。建议将此目录添加到全局$PATH变量中$GOPATH/pkg
目录中,会存储预编译的obj文件(文件名根据操作系统的不同而不同,例如mac下为darwin_amd64
),以加快程序的后续编译。大多数开发人员不需要访问此目录。后面还会介绍,pkg下的mod文件还会存储go module
的依赖。$GOPATH/src
目录 存储我们项目的go代码。通常包含许多版本控制存储库(例如,由Git管理),每个存储库都包含了一个或多个package,每个package都在一个目录中包含一个或多个Go源文件。- 因此,整个路径看起来像是:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17go/ ├── bin └── main.exe ├── pkg ├── darwin_amd64 └── mod └── src ├── github.com │ ├── tylfin │ │ ├── dynatomic │ │ └── geospy │ └── uudashr │ └── gopkgs └── golang.org └── x └── tools
- gopath具有多个作用,当我们想从github或其他地方获取go项目代码时,我们可以使用
go get
指令。 此时程序会默认的将代码存储到$GOPATH/src
目录中。例如拉取go get github.com/dreamerjackson/theWayToGolang
时,目录结构如下:
复制代码
1
2
3
4
5
6
7
8go/ ├── bin ├── pkg └── src └── github.com └── dreamerjackson └── theWayToGolang
- 当我们使用
go get
的-u
参数时,会将该项目以及项目所依赖的所有其他项目一并下载到$GOPATH/src
目录中 - gopath的另一个功能是明确package的导入位置。前文我们介绍过,go代码通过package进行组织,在helloworl程序中,我们导入了go语言内置的
fmt
package.当我们要导入第三方时应该怎么做呢?其实如果我们在项目中导入了一个第三方包,例如
复制代码
1
2import "blue/red"
实际引用的是$GOPATH/src/blue/red
文件中的代码。
同理,如果导入为
复制代码
1
2import "github.com/gobuffalo/buffalo"
实际引用的是$GOPATH/src/github.com/gobuffalo/buffalo
文件中的代码。
下面我们用一个例子来说明导入第三方包
- 首先在
$GOPATH/src
中新建一个文件夹mymath
,在文件夹中新建一个文件add.go
复制代码
1
2
3
4» mkdir mymath » cd mymath » touch add.go
add.go的内容如下,要注意导出的函数必须是首字母大写的,这是go语言的规则。
复制代码
1
2
3
4
5package mymath func Add(a int, b int) int { return a + b }
接着在$GOPATH/src
中创建一个main.go文件,即可以完整的调用mymath
包中的add
函数。
复制代码
1
2
3
4
5
6
7
8
9
10package main import ( "fmt" "mymath" ) func main() { result := mymath.Add(1, 2) fmt.Println("result:", result) }
- 通过
go run main.go
即可运行输出1+2
的结果3
gopath的优劣
- 相比于其他语言繁琐的配置,go语言中的工作空间
gopath
配置相对简单,容易理解 - gopath使得在文件系统组织整个代码更加简洁、结构化,但是限制在单一的工作空间中。
- gopath并没有解决版本依赖的问题,而将其留给了其他工具去实现。正因为如此,gopath中的代码就是一个唯一的master分支,并且强制使用各个模块最新的代码。
总结
- 本文介绍了gopath的含义、功能、优劣、以及如何通过GOPATH来组织项目,导入第三方库。
- 在go1.13之后,go官方已经开始全面拥抱
go module
.我们在下文中,将介绍go module
的原理和用法,以及如何通过go module
进行go语言的依赖管理与项目组织。
参考资料
- 项目链接
- 作者知乎
- blog
- I still ❤️ you, GOPATH
- How to Write Go Code (with GOPATH)
- How to Write Go Code
最后
以上就是着急发箍最近收集整理的关于golang快速入门[7.1]-项目与依赖管理-gopath前文的全部内容,更多相关golang快速入门[7内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复