Go 语言基础之环境搭建
Go 语言安装
下载
官网下载地址:https://golang.org/dl/
国内下载:https://studygolang.com/dl
Windows 平台和 Mac 平台推荐下载可执行文件版,Linux 平台下载压缩文件版。
Windows 下载可执行文件版,按照提示一步步安装即可,默认安装路径是C:\Program Files\Go\
。
安装完毕后,在命令行中使用go version
命令可以查看安装的版本:
> go version
go version go1.17.4 windows/amd64
使用go env
命令可以查看安装的环境变量:
> go env
set GO111MODULE=
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\xxx\AppData\Local\go-build
set GOENV=C:\Users\xxx\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\xxx\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\xxx\go
set GOPRIVATE=
set GOPROXY=https://proxy.golang.org,direct
set GOROOT=D:\Program Files\Go
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=D:\Program Files\Go\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.17.4
set GCCGO=gccgo
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=NUL
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\HUANGZ~1\AppData\Local\Temp\go-build2615393086=/tmp/go-build -gno-record-gcc-switches
其中,GOROOT
环境变量是 Go 源代码的安装目录。除此之外,我们还需要关注GOPATH
、GO111MODULE
和GOPROXY
这三个变量。
配置 GOPATH
GOROOT
是 Go 源代码的安装路径,而GOPATH
是项目程序存放的目录。从Go 1.8
版本开始,Go 可执行文件版在安装时会为GOPATH
设置一个默认目录,并且在Go 1.14
及之后的版本中启用了Go Module
模式之后,不一定非要将项目程序写到GOPATH
目录下。
Go Module
版本管理方式出现之前,开发者创建的项目程序一般都存放在$GOPATH/src
目录下,使用go get
命令下载的第三方依赖也会存放在这个目录下。GOPATH
目录结构一般会有三个子目录:
bin
:编译后的可执行文件pkg
:编译时生成的对象文件src
:库文件
这种依赖于GOPATH
环境变量的设置在Go Module
版本管理出现之后逐渐被摒弃。在Go Module
方式下,开发者可以在任意目录下创建子目录作为项目程序的目录,使用的第三方依赖会下载到$GOPATH/pkg/mod
目录下。
如果不想使用默认路径作为GOAPTH
目录,需要对 Windows 的GOPATH
环境变量进行修改:
开启 Go Module
Go Module
默认是不开启的,且GOPROXY
默认配置拉取依赖网址是https://proxy.golang.org,direct
,国内是访问不到该网址,所以我们需要换一个 PROXY,推荐使用https://goproxy.io
或https://goproxy.cn
。执行下面的命令进行修改:
$ go env -w GO111MODULE=on
$ go env -w GOPROXY=https://goproxy.cn,direct
GO111MODULE
有三个可选值:off、on、auto,默认值是 auto。
-
GO111MODULE=off
:禁用模块支持,编译时会从GOPATH
和 vendor 文件夹中查找包。 -
GO111MODULE=on
:启用模块支持,编译时会忽略GOPATH
和 vendor 文件夹,只根据go.mod
下载依赖。 -
GO111MODULE=auto
:当项目在$GOPATH/src
外且项目根目录有go.mod
文件时,开启模块支持。
vender 机制是Go1.5
版本之后开始支持,能够控制 Go 语言程序编译时依赖包搜索路径的优先级。在查找项目的某个依赖包时,首先会在项目根目录下的 vender 文件夹中查找,如果没有找到才会去$GOAPTH/src
目录下查找。
Goland 配置
创建项目
安装 go fmt 和 go imports
go imports
在配置前需要先使用go get
命令拉取依赖:
go get -u golang.org/x/tools/cmd/goimports
go fmt
:保存的时候自动格式化 Go 代码;go imports
:保存的时候自动导入处理包。
go mod 命令
☕️ 常用的go mod
命令
- 初始化一个文件夹,创建
go.mod
文件
go mod init
go mod init 模块名
- 下载依赖的 module 到本地 cache(默认为
$GOPATH/pkg/mod
)
go mod download
- 编辑
go.mod
文件,选项有-json
、-require
和-exclude
,可以使用帮助go help mod edit
go mod edit
- 以文本模式打印模块需求图
go mod graph
- 增加缺少的 module,删除无用的 module
go mod tidy
- 将依赖复制到 vendor 下
go mod vendor
- 验证依赖是否正确
go mod verify
- 解释为什么需要依赖
go mod why
⭐️ go.mod
格式
go.mod
文件记录了项目所有的依赖信息,其结构大致如下:
module github.com/Q1mi/studygo/blogger
go 1.12
require (
github.com/DeanThompson/ginpprof v0.0.0-20190408063150-3be636683586
github.com/gin-gonic/gin v1.4.0
github.com/go-sql-driver/mysql v1.4.1
github.com/jmoiron/sqlx v1.2.0
github.com/satori/go.uuid v1.2.0
google.golang.org/appengine v1.6.1 // indirect
)
其中,module 用来定义包名,require 用来定义依赖包及版本,indirect 表示间接引用。
go mod
支持语义化版本号,比如go get foo@v1.2.3
,也可以跟 git 的分支或 tag,比如go get foo@master
,当然也可以跟 git 提交哈希,比如go get foo@e3702bed2
。关于依赖的版本支持以下几种格式:
gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7
gopkg.in/vmihailenco/msgpack.v2 v2.9.1
gopkg.in/yaml.v2 <=v2.2.1
github.com/tatsushid/go-fastping v0.0.0-20160109021039-d7bb493dee3e
latest
在国内访问golang.org/x
的各个包都需要FQ,可以在go.mod
中使用 replace 替换成 github 上对应的库。
replace (
golang.org/x/crypto v0.0.0-20180820150726-614d502a4dac => github.com/golang/crypto v0.0.0-20180820150726-614d502a4dac
golang.org/x/net v0.0.0-20180821023952-922f4815f713 => github.com/golang/net v0.0.0-20180826012351-8a410e7b638d
golang.org/x/text v0.3.0 => github.com/golang/text v0.3.0
)
go get 命令
在项目中执行go get
命令可以下载依赖包,并且还可以指定下载的版本。
-
运行
go get -u
将会升级到最新的次要版本或者修订版本(x.y.z
,z 是修订版本号,y 是次要版本号) -
运行
go get -u=patch
将会升级到最新的修订版本 -
运行
go get package@version
将会升级到指定的版本号 version
如果下载所有依赖最好使用go mod download
命令。具体使用如下:
- 下载项目依赖
go get ./...
- 拉取最新的版本(优先择取 tag)
go get golang.org/x/text@latest
- 拉取 master 分支的最新 commit
go get golang.org/x/text@master
- 拉取 tag 为 v0.3.2 的 commit
go get golang.org/x/text@v0.3.2
- 拉取 hash 为 342b231 的 commit,最终会被转换为 v0.3.2:
go get golang.org/x/text@342b2e
- 指定版本拉取,拉取 v3 版本
go get github.com/smartwalle/alipay/v3
- 更新
go get -u github.com/gin-gonic/gin
一般来说,如果不使用go get package@version
命令拉取依赖,最好使用go get -u
命令去拉取。go get
命令只会拉取本地没有的依赖,如果依赖存在就什么都不做;go get -u
命令会在本地依赖存在的情况下将其版本进行更新,没有就去拉取依赖。