MENU

Go 学习笔记:go module的基本使用

September 14, 2021 • Read: 251 • Golang

在go的1.11版本中,引入了一个新的依赖管理库go module,用于替换旧的基于GOPATH的方法来指定在给定构建中使用哪些源文件,这个特性在1.13版本中被正式推荐使用

在基于GOPATH的方式中,我们需要将项目写到GOPATH下的src文件夹中,但是使用go module之后便可以不用将代码放置到src目录下了。使用了go module的项目中,会在项目的目录中生成两个新的文件:go.modgo.sum,分别用来记录当前项目的信息(项目名,go版本号,依赖)和每一个依赖库的哈希值

Ⅰ.准备工作

但是go module并不是默认开启的,你需要一些简短的设置,在你的终端中执行以下命令:

go env -w GO111MODULE=on

GO111MODULE的参数有三个:

参数描述
on强制启用
off强制关闭
auto对于存在go.mod的项目自动启用

启用go module之后,就可以设置Go Proxy了,这是GO的代理,类比于Linux系统的换源

go env -w GOPROXY=https://goproxy.cn,direct

这里使用的是七牛云的一个代理,速度还蛮快的,如果需要使用阿里云的,可以选择这个:

go env -w GOPROXY=https://mirrors.aliyun.com/goproxy,direct

检查一下go的环境有无正确被配置

go env

检查输出中的GO111MODULE="on"GOPROXY="https://goproxy.cn,direct"是否和我的一致,如果不一致,请自行检查是否前置步骤出现问题

Ⅱ.开启新的项目

启用go module之后,我们先新建一个文件夹,文件夹名字不重要,因为项目名称已经与这个文件夹无关了,我们先将目录切换到这个文件夹下

cd /myPath/code/myProject

然后新建项目

go mod init <project name>

你会发现文件夹下出现了一个go.mod文件,不要改动它,我们先新建一个文件:app.go

touch app.go

往里边随便写点东西

vim app.go
package main

import "fmt"

func main() {
    fmt.Println("Hello world")
}

这只是一个最基础的文件,测试一下是否能正常运行,如果不能正常运行,请自行检查前序步骤

如果我们现在安装一个新的包呢?我们这里用"gitee.com/go-package/carbon"这个包来举例,这是一个处理时间的包,具体链接:carbon: 轻量级、语义化、对开发者友好的Golang时间处理库 (gitee.com)

我们这里将上述代码改成:

package main

import (
    "fmt"
    
    "gitee.com/go-package/carbon"
)

func main() {
    fmt.Println(carbon.Now())
}

我们保存,然后运行如下代码:

go mod tidy

我们打开go.mod文件:

module test

go 1.13

require gitee.com/go-package/carbon v1.5.4

我们发现,依赖项已经被记录下来了,接下来就是将依赖安装到本地

go mod download

在经过电脑一顿处理以后,依赖像终于被安装上了,这里的依赖会被默认安装到GOPATH下,如果你没有设置GOPATH的地址,那么GOPATH将会使用默认地址

如果安装失败,请检查代理是否有正确设置

如果不想让他被放在GOPATH下,我们可以使用

go mod vendor

将依赖移动到当前目录下,这将会自动创建vendor文件夹,用来存放依赖

  1. GO 在1.5版本的时候引入了vendor模式,如果项目目录下有vendor目录,会优先使用vendor内的包进行编译与测试
  2. 不同于pip或者npm,go module对于依赖的添加思路是现在文件中写出相关依赖,然后自动安装

Ⅲ.引入本地包

我们不仅仅能通过网络引入包,也可以引入本地写的包,例如,我现在有一个本地的包myPackage

我们先在这个项目下新建一个文件夹:

mkdir myPackage

然后新建一个文件add.go

package mypackage

func Add(num1, num2 int) int {
    return num1, num2
}

如果我们要使用这个包,只需要在项目文件夹下的app.go中这样写:

package main

import (
    "fmt"

    "test/mypackage" // test 是项目名
)

func main() {
    ans := mypackage.Add(12, 24)
    fmt.Println(ans)
}

尝试运行一下,输出正常了

我们打开go.mod看看,本地引入的包是不会记录到go.mod中的

module test

go 1.13

require gitee.com/go-package/carbon v1.5.4

GO MODULE 常用命令

命令描述
go mod init初始化go.mod
go mod tidy更新依赖文件
go mod download下载依赖文件
go mod vendor将依赖转移至本地的vendor文件
go mod edit手动修改依赖文件
go mod graph打印依赖图
go mod verify校验依赖

参考:go module基本使用 - 牛奔 - 博客园 (cnblogs.com)

Last Modified: September 17, 2021
Archives Tip
QR Code for this page
Tipping QR Code