作为一名golang开发者,有必要对go中的环境变量进行了解。
在go 1.11以前,是需要我们手动去配置环境变量,而且只能在GOPATH
目录下进行项目开发,由于对新手相当不友好。
在go 1.11之后,go官方采用了一种友好的方式 go mod,对于初学者不必去手动配置环境变量,go 把这一切做了屏蔽,底层这些环境变量仍然存在,只是go帮我打理好了这一切。
PS: 如果你在某些教程上仍然看到,要求你在
GOPATH
下创建项目,大可不必,要知道哪是对于未使用go模块的项目
在正式开始前,我们先来看一眼go中的环境变量,使用命令go env
即可查,如果只想单独查看某一个环境变量,可以使用go env XX变量
,比如go env GOPATH
,查看GOPATH
dongmingyan@pro ⮀ ~ ⮀ go env
GO111MODULE="on"
GOARCH="amd64"
GOBIN=""
GOCACHE="/Users/dongmingyan/Library/Caches/go-build"
GOENV="/Users/dongmingyan/Library/Application Support/go/env"
GOEXE=""
GOEXPERIMENT=""
GOFLAGS=""
GOHOSTARCH="amd64"
GOHOSTOS="darwin"
GOINSECURE=""
GOMODCACHE="/Users/dongmingyan/go/pkg/mod"
GONOPROXY=""
GONOSUMDB=""
GOOS="darwin"
GOPATH="/Users/dongmingyan/go"
GOPRIVATE=""
GOPROXY="https://goproxy.cn,direct"
GOROOT="/usr/local/go"
GOSUMDB="sum.golang.org"
GOTMPDIR=""
GOTOOLDIR="/usr/local/go/pkg/tool/darwin_amd64"
GOVCS=""
GOVERSION="go1.20.5"
GCCGO="gccgo"
GOAMD64="v1"
AR="ar"
CC="clang"
CXX="clang++"
CGO_ENABLED="1"
GOMOD="/dev/null"
GOWORK=""
CGO_CFLAGS="-O2 -g"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-O2 -g"
CGO_FFLAGS="-O2 -g"
CGO_LDFLAGS="-O2 -g"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -arch x86_64 -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/var/folders/j8/08btplt912l0m3jg760nkbpw0000gn/T/go-build1155094407=/tmp/go-build -gno-record-gcc-switches -fno-common"
这里环境变量非常多,我们挑重点的介绍,一般来讲,我常使用的也就那么几个。
PS:
这里的环境变量区别于我们系统的环境变量,如果直接使用
echo $GOPATH
我们是看不到值的,也是就是需要我们把这些变量写入系统的初始化里面才能有值
GOROOT
特别说明: 由于我是mac电脑,所以我这里也是根据mac电脑阐明路径,window系统只是路径不同,其功能一样。
在mac上路径是:GOROOT="/usr/local/go"
这里存放的go sdk(软件开发工具包),包括编译、执行命令(比如go)、和go自身的库。
GOPATH
这里区别于go 自身sdk,这里放的是一些基于go语言开发的一些东西(包、命令、项目源代码)
这里主要有三个目录:
- pkg
如果使用了模块在pkg/mod存放一些我们go install/get
或者go mod tidy
下来的包,我们称之为模块缓存,如果想清理这些模块缓存使用go clean -modcache
- bin
这里存放的是,我们安装包带的命令会在这里比如air
/godoc
- src
在使用go模块后,这里路径就弱化了,在使用模块以前,我们开发go项目比如在这里创建项目
GOPROXY
image.png早期的时候我们要拉取包,直接能直接去项目仓库拉取,但是这样做不够稳定和安全,于是诞生了GOPROXY,用于集中管理包的下载。
默认情况下,这里的值是
GOPROXY="https://proxy.golang.org,direct"
如果是国内为了方便拉取,最好修改成国内的竞相地址,可以使用
go env -w GOPROXY=https://goproxy.cn,direct
这个命令用于修改环境变量的值。
GOBIN
用于设置go install/build 可执行文件存放位置,默认情况下,这个值是空的;此时可执行文件会存放在$GOPATH/bin
中
GO111MODULE
看到这里的111你就应该知道这个指的是go的版本号1.11,从这里开始就有了go模块,如果是这个版本之后的默认情况下这个是开启的值为on
;如果是比较古老的go版本,想要使用模块,需要手动开启。
Go mod(模块)
有两个最常用的命令
go init example/play # 初始化模块
go mod tidy # 更新当前项目的依赖
有两个文件
- go.mod
这个是依赖定义文件,用于锁定项目需要用到包的版本,相当于ruby语言中的gemfile.lock - go.sum
一个包校验文件,一个包下载后来进行hash校验,保证安全性
Go mod vendor
这个不是环境变量,这个是在某些时候,我们担心一些包可能以后下载不了,我们可以使用go mod vendor
这会在你项目的层级创建一个vendor
Go mod vendor,在这个目录下,存放此项目相关的依赖包源文件都会放到这个目录。
GOPRIVATE
这个是用于我们私自开发的一些包,没有公开,这些包只属于我们个人/公司,我们使用的时候,希望这些包不要去默认的GOPROXY中拉取,而是到指定的地方中拉取的情况。
比如:
GOPRIVATE=*github.com/org_name
凡是包路径符合这个路径的包,都不会去GOPROXY中获取。
网友评论