Go项目的环境变量
设置GOROOT和GOPATH
GOROOT应为go的安装目录。 GOPATH可以设定为自己想要的位置,以后go项目需要的依赖库都会存放在这个路径下面。
GOPATH: Go项目结构
在进行Go语言开发的时候,我们的代码总是会保存在$GOPATH/src
目录下。在工程经过go build
、go install
或go get
等指令后,会将下载的第三方包源代码文件放在$GOPATH/src
目录下, 产生的二进制可执行文件放在 $GOPATH/bin
目录下,生成的中间缓存文件会被保存在 $GOPATH/pkg
下。
如果我们使用版本管理工具(Version Control System,VCS。常用如Git)来管理我们的项目代码时,我们只需要添加$GOPATH/src
目录的源代码即可。bin
和 pkg
目录的内容无需版本控制。
GOPATH 默认是 c:\ User \ 用户名 \ go。可自定义,该目录下有三个文件夹(如果没有,可以手动创建)
--- src 存放代码。
--- bin 编译生成的可执行程序。
--- pkg 编译时生成的对象文件。
源代码都是存放在GOPATH
的src
目录下,那我们可以按照下图来组织我们的代码。
目前流行的项目结构
Go语言中也是通过包来组织代码文件,我们可以引用别人的包也可以发布自己的包,但是为了防止不同包的项目名冲突,我们通常使用顶级域名
来作为包名的前缀,这样就不担心项目名冲突的问题了。
因为不是每个个人开发者都拥有自己的顶级域名,所以目前流行的方式是使用个人的github用户名来区分不同的包。
举个例子:张三和李四都有一个名叫studygo
的项目,那么这两个包的路径就会是:
import "github.com/zhangsan/studygo"
和
import "github.com/lisi/studygo"
以后我们从github上下载别人包的时候,如:
go get github.com/jmoiron/sqlx
那么,这个包会下载到我们本地GOPATH
目录下的src/github.com/jmoiron/sqlx
。
适合企业开发者
介绍go module及区分go
go get: 若是GOPATH设置的工程目录,代码在src目录下,然后在命令提示符中输入:go get github.com/astaxie/beego,这样就在src目录下生成了github.com/astaxie/beego包。 注意:在使用GoLand工具时,配置settings->Go->GOPATH->Project GOPATH为当前工程目录
若是想要在其他位置新建go项目,就不得不更改系统变量GOPATH,将其设为新项目的位置,可能还要改goland中的GOPATH设置。
go mod是golang1.11后引入的package依赖管理工具,用于解决之前没有地方记录依赖包具体版本的问题,方便依赖包管理。
之前主要是用GOPATH 和 Vendor,vendor相对主流,但现在官方更提倡go mod。
在GOPATH的目录下,新建项目文件夹,进入新建路径执行go mod init,在文件夹下生成go.mod文件,然后将需要引入外部包的go文件置于项目目录下,编译文件,就会把外部包下载到本地的GOPATH/pkg/mod目录下。
set GO111MODULE=off,GOPATH mode,查找vendor和GOPATH目录。
set GO111MODULE=auto,如果当前目录不在$GOPATH 并且 当前目录(或者父目录)下有go.mod文件,则使用 GO111MODULE, 否则仍旧使用 GOPATH mode。
注意:在使用GoLand工具时,不要配置Project GOPATH为当前工程目录,最好不要配置Project GOPATH,而是配置Module GOPATH
在使用模块的时候, GOPATH 是无意义的,不过它还是会把下载的依赖储存在 GOPATH/src/mod 中,也会把 go install 的结果放在 GOPATH/bin(如果 GOBIN 不存在的话)
GO Modules 使用
私人依赖包,如何处理
1. 创建模块的目录 ,并伸出go.mod 文件
mkdir modules go mod init modules
2. 创建自己的package目录 如 base
module |--- main.go |---go.mod |---base |---testBase.go
其中main.go 的内容
package main import "modules/base" func main(){ base.Test() }
testBase.go 的文件内容
package base import "fmt" func Test(){ fmt.Println("Bast Test) }
可以看到 在任何模块的个人package的引用都必须使用 module/ 开头的路径地址。
再任何文件的 import时,go会再当前目录向上级目录逐级查找go.mod文件,比较mod文件中的 module 名称是否与查找的引用包路径匹配,然后按照引用路径查找。
针对之前没有有使用过go mod 的项目,需要的操作步骤是
1.将原来的src 下的代码拷贝到某个GOPATH之外的目录中,比如 server
2.在server目录下 ,go mod init server ,当前模块的根目录即是 server
3.将其他文件里的个人定义的包的引用路径改为 server/XXX ,以便于可以从模块的根目录找到
4. 在命令行 执行 go build server ,可以刷新所有的引用包且编译出可执行文件
针对国内墙,无法取到某些package的情况
1. 使用 https://goproxy.io ,通过设置
2. 通过go mod replace命令
比如golang.org/x 下面的package是无法再国内直接获取的,可以通过修改go.mod文件将地址替换为 github上的镜像,基本都可以找到
在生产的go.mod 文件里添加
replace (
golang.org/x/crypto => github.com/golang/crypto latest
golang.org/x/net => github.com/golang/net latest
golang.org/x/sync => github.com/golang/sync latest
golang.org/x/sys => github.com/golang/sys
golang.org/x/text => github.com/golang/text
)
这样就可以从GitHub上获取对于的包文件
相关文档:
1. https://roberto.selbach.ca/intro-to-go-modules/
这是Roberto Selbach大神写的这篇 Step by step的 go mod入门文章,非常好理解
2. https://github.com/golang/go/wiki/Modules
go mod的官方文档,想了解的多一点最好还是通读一下