在以前文章中,咱们介绍了go语言开发环境的配置
在本章中,咱们将介绍go语言的项目结构、项目管理以及依赖管理。在本文中,咱们关注gopath
在go语言开发环境配置文章中,咱们介绍了配置gopath
与goroot
环境变量的步骤,可是并无对其进行深刻解释。能够在终端输入 go env
或者go env gopath
查看具体的配置
C:\Windows\system32> go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\jackson\AppData\Local\go-build
set GOENV=C:\Users\jackson\AppData\Roaming\go\env
set GOEXE=.exe
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\jackson\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=c:\go
...
在go1.8以后,若是不指定gopath,则gopath是默认的。
在mac,linux下为$HOME/go
windows 下为%USERPROFILE%\g
gopath
能够理解为go语言的工做空间,内部存储了src
,bin
,pkg
三个文件夹
go/
├── bin
├── pkg
└── src
$GOPATH/bin
目录存储了经过go install
安装的二进制文件。操做系统使用PATH变量中
$GOPATH/pkg
目录中,会存储预编译的obj文件(文件名根据操做系统的不一样而不一样,例如mac下为darwin_amd64
),以加快程序的后续编译。大多数开发人员不须要访问此目录。后面还会介绍,pkg下的mod文件还会存储go module
的依赖。
$GOPATH/src
目录 存储咱们项目的go代码。一般包含许多版本控制存储库(例如,由Git管理),每一个存储库都包含了一个或多个package,每一个package都在一个目录中包含一个或多个Go源文件。
所以,整个路径看起来像是:
go/
├── 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
时,目录结构以下:
go/
├── bin
├── pkg
└── src
└── github.com
└── dreamerjackson
└── theWayToGolang
当咱们使用go get
的-u
参数时,会将该项目以及项目所依赖的全部其余项目一并下载到$GOPATH/src
目录中
gopath的另外一个功能是明确package的导入位置。前文咱们介绍过,go代码经过package进行组织,在helloworl程序中,咱们导入了go语言内置的fmt
package.当咱们要导入第三方时应该怎么作呢?其实若是咱们在项目中导入了一个第三方包,例如
import "blue/red"
实际引用的是$GOPATH/src/blue/red
文件中的代码。
同理,若是导入为
import "github.com/gobuffalo/buffalo"
实际引用的是$GOPATH/src/github.com/gobuffalo/buffalo
文件中的代码。
首先在$GOPATH/src
中新建一个文件夹mymath
,在文件夹中新建一个文件add.go
» mkdir mymath
» cd mymath
» touch add.go
add.go的内容以下,要注意导出的函数必须是首字母大写的,这是go语言的规则。
package mymath
func Add(a int, b int) int {
return a + b
}
接着在$GOPATH/src
中建立一个main.go文件,便可以完整的调用mymath
包中的add
函数。
package main
import (
"fmt"
"mymath"
)
func main() {
result := mymath.Add(1, 2)
fmt.Println("result:", result)
}
经过go run main.go
便可运行输出1+2
的结果3
相比于其余语言繁琐的配置,go语言中的工做空间gopath
配置相对简单,容易理解
gopath使得在文件系统组织整个代码更加简洁、结构化,可是限制在单一的工做空间中。
gopath并无解决版本依赖的问题,而将其留给了其余工具去实现。正由于如此,gopath中的代码就是一个惟一的master分支,而且强制使用各个模块最新的代码。
本文介绍了gopath的含义、功能、优劣、以及如何经过GOPATH来组织项目,导入第三方库。
在go1.13以后,go官方已经开始全面拥抱go module
.咱们在下文中,将介绍go module
的原理和用法,以及如何经过go module
进行go语言的依赖管理与项目组织。