之前使用GOPATH全局变量进行go工程的包管理,总觉得有些别扭。今天抽时间研究了一下go mod,发现还是很方便的。
环境准备1. 设置GO111MODULE
GO111MODULE有三个取值,分别是on, off, auto,默认值为auto。
on:开启模块管理,忽略GOPATH目录,根据go.mod下载依赖。
off:关闭模块管理,从GOPATH目录寻找包。
auto:如果在$GOPATH/src目录中,则忽略go.mod,否则根据go.mod下载依赖。
如果你的代码没有处于$GOPATH/src目录中,可以使用默认的auto,否则,需要执行:
go env -w GO111MODULE=on
2. 设置GOPROXY
由于墙的原因,很多google的包下载不到,下载得到的包,由于很多处于境外服务器上,速度也比较慢,可以使用七牛云的代理,执行:
go env -w GOPROXY=https://goproxy.cn,direct
准备测试代码
以一个简单的打印成绩单的工程为例,该工程目录如下:
├── go.mod
├── go.sum
├── main.go
└── transcript
├── transcript.go
└── transcript.yaml
代码内容如下:
// main.go
package main
import (
"github.com/haoranzeus/blogcode/202108/code01/transcript"
)
func main() {
transcript.GetScores()
}
// transcript/transcript.go
package transcript
import (
"fmt"
"gopkg.in/yaml.v2"
"io/ioutil"
)
func GetScores() {
file, err := ioutil.ReadFile("transcript/transcript.yaml")
if err != nil {
panic(err)
}
result := make(map[string]map[string]string)
yaml.Unmarshal(file, &result)
for key, value := range result["成绩"] {
fmt.Println(key, value)
}
}
# transcript/transcript.yaml
成绩:
语文: 100
数学: 99
外语: 98
使用go mod
1. 初始化
执行:
go mod init github.com/haoranzeus/blogcode/202108/code01
当前目录下出现一个文件:
go.mod
内容为:
module github.com/haoranzeus/blogcode/202108/code01
go 1.13
此时,这个包已经通过go.mod进行管理了。
2. 运行代码
可直接执行go run main.go
此时go mod会根据代码中的依赖关系,自动下载所需要的包,比如这里的yaml包。执行结果
语文 100
数学 99
外语 98
再看go.mod文件,此时内容已经是:
module github.com/haoranzeus/blogcode/202108/code01
go 1.13
require gopkg.in/yaml.v2 v2.4.0