这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
1 go依赖管理
1.1 Go依赖管理的三个阶段
1.1.1 GOPATH
在Go 1.5之前,主要使用GOPATH来管理包的位置。此时如果使用go get命令安装第三方包,则该第三方依赖的源码会放到$GOPATH/src下,当你的项目进行编译时,则会自动去$GOPATH底下找到该依赖包。但是所有项目必须都在$GOPATH下,否则编译器找不到对应的依赖包;否则的话,你就要将你的项目路径添加到$GOPATH中,这对于开发者来说无疑是做了很多重复无意义的工作的。
1.1.2 Vendor
基于以上GOPATH依赖管理存在的问题,在Go 1.5提出在项目目录下引入vendor文件夹存放第三方包,将第三方依赖的源码放到该文件夹底下,不同的项目有属于他们自己的vendor文件夹。
但是每个项目都有一个vendor文件夹,随着项目越来越大,代码库也会越来越大,有时只是依赖某个第三包的某个小功能,却需要将整个第三方依赖都下载下来放在项目目录下,造成冗余。
1.1.3 mod
go module是 Go 1.11 版本之后官方推出的版本管理工具,在 Go 1.13以后成为Go语言默认的依赖管理工具。
1.2 go mod
1.2.1 go.mod文件
go.mod文件定义module路径以及列出其他需要在build时引入的模块的特定的版本,还可以指定要替换和排除的版本。
1.2.2 GO111MODULE环境变量
要启用go module模式需要设置环境变量 GO111MODULE,通过它了开启或关闭模块支持,其有三种模式on、off、auto,默认值为auto。
go env -w GO111MODULE=on
1.2.3 三种模式
- off:禁用MODULE支持,编译时会从GOPATH和vendor文件下寻找包
- on:启用MODULE支持,编译时会忽略GOPATH和vendor,使用go.mod下载依赖。此时GOPATH不再充当导入的角色,当仍然承担存放第三方依赖源码的角色,会将第三方依赖源码放在$GOPATH/pkg/mod下
- auto:当项目在$GOPATH/src目录外,且项目根目录有go.mod文件时,启用模块支持
2 go单元测试
Go程序主要包含三类测试: 功能测试(test)、基准测试(benchmark,也称性能测试)以及示例测试。
测试源码文件的主名称应该以被测试源码文件的主名称为前导, 并且必须以“_test”为后缀,如被测试的源码文件名是demo.go 那么测试源码文件名是demo_test.go
2.1 示例
main.go
package main
import (
"fmt"
)
func main() {
fmt.Println(Sum(4,5))
}
func Sum(a, b int) int {
return a + b
}
main_test.go
package main
import "testing"
func TestSum(t *testing.T) {
got := Sum(1, 2)
want := 4
if got != want {
t.Errorf("sum(1,2) == %d,want %d", got, want)
}
}
要运行测试,只需使用以下go test命令:
go test main_test.go
结果: