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 源代码的安装目录。除此之外,我们还需要关注GOPATHGO111MODULEGOPROXY这三个变量。


配置 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.iohttps://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命令会在本地依赖存在的情况下将其版本进行更新,没有就去拉取依赖。


参考

  1. Go语言之依赖管理
  2. 三分钟掌握Go mod常用与高级操作
  3. go get 加 -u 和不加 -u 参数的区别
原文地址:https://www.cnblogs.com/zongmin/p/15656783.html