1,Go 环境变量

  • GOROOT:包含 GO 语言的安装根目录的路径
    • Go 1.10 版本引入默认的 GOROOT,开发者无须设置
  • GOPATH:包含若干个工作区目录的路径
    • 在有了 Go Moudle 后,该变量可能会被移除
  • GOBIN:包含用于放置 GO 程序生成的可执行文件的目录路径
  • GO111MODULE:指示当前项目的构建模式,是 GOPATH 还是 Go Moudle
    • 在 Go1.16 版本 Go Module 默认开启,该变量值默认为 on
  • GOARCH:用于指示 Go 编译器生成代码所针对的平台 CPU 架构
    • 主要值是 AMD64、Arm 等,默认值是本机 CPU 架构
  • GOOS:用于指示 Go 编译器生成代码所针对的操作系统
    • 主要值是 Linux、Darwin、Windows等,默认值是本机操作系统
  • GOCACHE:用于指示存储构建结果缓存的路径,这些缓存可能会被后续的构建所使用
    • 在不同的操作系统上,GOCACHE 有不同的默认值
    • 在 Linux 中,其值为 $HOME/.cache/go-build
  • GOMODCACHE:用于指示存放 Go Module 的路径
    • 在不同的操作系统上,GOMODCACHE 有不同的默认值
    • 在 Linux 中,其值为 $HOME/go/pkg/mod
  • GOPROXY:用来配置 Go Module proxy 服务
    • 其默认值是 https://proxy.golang.org,direct
    • 在国内,可设置为 https://goproxy.cn,direct

2,Go 常用命令

0,go fmt              // 格式化代码
1,go run main.go      // 运行 go 程序
2,go build main.go    // 编译构建项目
3,go install          // 将可执行程序安装在当前工作区的 bin 目录,或 GOBIN 包含的目录
4,go env              // 查看 go 配置项
5,go help environment // 查看 go 配置项详细信息
6,go mod init         // 初始化 go module
7,go mod tidy         // 添加相关依赖
8,go list -m -versions github.com/sirupsen/logrus // 查看某个依赖的所有版本
9,go get github.com/go-redis/redis/v7             // 获取依赖
10,go list -m all     // 查看当前 module 的所有依赖

3,Go Module 模式

一个 Go Module 是一个 Go 包的集合。module 是有版本的,所以 module 下的包也就有了版本属性。这个 module 与这些包会组成一个独立的版本单元,它们一起打版本、发布和分发。

每个 go.mod 文件会定义唯一一个 module,所以 Go Module 与 go.mod 是一一对应的。

1,Go Module 创建项目的步骤

  1. 通过 go mod init 创建 go.mod 文件,将当前项目变为一个 Go Module
  2. 通过 go mod tidy 命令自动更新当前 module 的依赖信息
  3. 执行 go build,执行新 module 的构建

~/go_test 目录下,创建文件 main.go

package main

import "github.com/sirupsen/logrus"

func main() {
  logrus.Println("hello, go module")
}

依次执行命令:

$ go mod init go_test
go: creating new go.mod: module go_test
go: to add module requirements and sums:
	go mod tidy

$ go mod tidy
go: finding module for package github.com/sirupsen/logrus
go: found github.com/sirupsen/logrus in github.com/sirupsen/logrus v1.9.0

$ go build
$ ls
go.mod  go.sum  go_test  main.go
$ ./go_test
INFO[0000] hello, go module
  • go.mod 中的 go directive,不是指你当前使用的 Go 版本,而是指你的代码所需的 Go 的最低版本

2,为当前 module 添加依赖

假如现在我们要在项目中使用 github.com/google/uuid 包:

package main

import (
  "github.com/google/uuid"
  "github.com/sirupsen/logrus"
)

func main() {
  logrus.Println("hello, go module")
  logrus.Println(uuid.NewString())
}

此时如果直接使用 go build 则会出现错误:

$ go build
main.go:4:2: no required module provides package github.com/google/uuid; to add it:
  go get github.com/google/uuid

此时可以根据提示使用 go get

$ go get github.com/google/uuid
go: downloading github.com/google/uuid v1.3.0
go get: added github.com/google/uuid v1.3.0

除了使用 go get,也可以使用 go mod tidy,前者需要一个个的添加,而后者则不需要,当依赖较多的时候,使用后者更合适。

3,使用指定版本的依赖

一般一个依赖会有非常多的发布版本,比如 logrus :

$ go list -m -versions github.com/sirupsen/logrus
github.com/sirupsen/logrus v0.1.0 v0.1.1 v0.2.0 v0.3.0 v0.4.0 v0.4.1 v0.5.0 v0.5.1 v0.6.0 v0.6.1 v0.6.2 v0.6.3 v0.6.4 v0.6.5 v0.6.6 v0.7.0 v0.7.1 v0.7.2 v0.7.3 v0.8.0 v0.8.1 v0.8.2 v0.8.3 v0.8.4 v0.8.5 v0.8.6 v0.8.7 v0.9.0 v0.10.0 v0.11.0 v0.11.1 v0.11.2 v0.11.3 v0.11.4 v0.11.5 v1.0.0 v1.0.1 v1.0.3 v1.0.4 v1.0.5 v1.0.6 v1.1.0 v1.1.1 v1.2.0 v1.3.0 v1.4.0 v1.4.1 v1.4.2 v1.5.0 v1.6.0 v1.7.0 v1.7.1 v1.8.0 v1.8.1 v1.9.0

如果要使用某个特定版本的 logrus,则使用下面命令:

$ go get github.com/sirupsen/logrus@v1.7.0
go: downloading github.com/sirupsen/logrus v1.7.0
go get: downgraded github.com/sirupsen/logrus v1.8.1 => v1.7.0

可以看到 go get 命令下载了 logrus v1.7.0 版本,并将 go.mod 中对 logrus 的依赖改为 v1.7.0。

4,使用版本号大于 1 的依赖

在 Go Module 构建模式下,当依赖的主版本号为 0 或 1 的时候,我们在 Go 源码中导入依赖包,不需要在包的导入路径上增加版本号,也就是:

import github.com/user/repo/v0 等价于 import github.com/user/repo
import github.com/user/repo/v1 等价于 import github.com/user/repo

当我们需要使用版本大于 1 的依赖时,需要类似下面的导入:

import "github.com/go-redis/redis/v7" 

然后再使用 go get 获取相应版本的依赖:

$ go get github.com/go-redis/redis/v7
go: downloading github.com/go-redis/redis/v7 v7.4.1
go: downloading github.com/go-redis/redis v6.15.9+incompatible
go get: added github.com/go-redis/redis/v7 v7.4.1

5,从项目中删除一个依赖

从项目中删除依赖:

  1. 从代码中删除指定的 import
  2. 执行 go mod tidy
  3. 执行 go build

6,Go Module 项目典型布局

project-name
├── cmd/
│   ├── app1/
│   │   └── main.go
│   └── app2/
│       └── main.go
├── go.mod
├── go.sum
├── internal/
│   ├── pkga/
│   │   └── pkg_a.go
│   └── pkgb/
│       └── pkg_b.go
├── pkg1/
│   └── pkg1.go
├── pkg2/
    └── pkg2.go
  • cmd 目录:存放项目要编译构建的可执行文件所对应的 main 包的源码文件
  • pkgN 目录:每个项目下的非 main 包都平铺在项目的根目录下,每个目录对应一个 Go 包
  • internal 目录:存放仅项目内部引用的 Go 包,这些包无法被项目之外引用

(完。)