前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang Module的使用 顶

Golang Module的使用 顶

作者头像
BGBiao
发布于 2019-09-09 08:42:37
发布于 2019-09-09 08:42:37
1.3K00
代码可运行
举报
文章被收录于专栏:容器云生态容器云生态
运行总次数:0
代码可运行

前言: 在Golang1.11之前的版本中,官方没有提供依赖和包管理工具。开发者通常会使用vendor或者glide的方式来管理依赖(也有直接使用GOPATH多环境方式),而在Golang1.11之后官方终于出了名为go modules的版本管理机制。

注意:

  • 在Golang1.11版本中需要使用export GO111MODULE=on来显式开启go module
  • 在Golang1.12之后默认开启了module

Golang Module快速入门

初始化项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 在GOPATH之外创建一个项目目录
➜  mkdir cmdb-job

# 进入目录后初始化一个module
➜  cd cmdb-job
➜  go mod init cmdb-job
go: creating new go.mod: module cmdb-job

# 查看生成的mod.md
➜  cat go.mod
module cmdb-job

go 1.12

# 使用第三方模块编写一丢丢代码逻辑
# 一个字符串简单几种加密方式的简单工具
➜ cat main.go
/*================================================================
*Copyright (C) 2019 BGBiao Ltd. All rights reserved.
*
*FileName:main.go
*Author:BGBiao
*Date:2019年09月07日
*Description:
*
================================================================*/
package main
import (
    "fmt"
    "github.com/xxbandy/go-utils/crypto"
)

func main() {
	fmt.Println(crypto.Md5("hello"))
	fmt.Println(crypto.Hmac("key2", "hello"))
	fmt.Println(crypto.Sha1("hello"))
	fmt.Println(crypto.HmacSha1("key2", "hello"))
}

# 查看下项目结构和依赖
➜ tree -L 1 .
.
├── go.mod
├── go.sum
└── main.go

测试运行项目

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 测试运行
# 第一次运行会自动检查代码里的第三方依赖包,并下载和接下项目依赖的包
➜  go run main.go
go: finding github.com/xxbandy/go-utils/crypto latest
go: finding github.com/xxbandy/go-utils latest
go: downloading github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2
go: extracting github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2
5d41402abc4b2a76b9719d911017c592
f1b90b4efd0e5c7db52dfa0efd6521a3
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
79806c50bab4825a371e3c4fff80bae0c731d54e

# 第二次运行
➜  go run main.go
5d41402abc4b2a76b9719d911017c592
f1b90b4efd0e5c7db52dfa0efd6521a3
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
79806c50bab4825a371e3c4fff80bae0c731d54e

# 查看管理mod的依赖配置
## go.mod会记录项目所需依赖以及具体的版本号记录(go-utils这个库没有版本,所以会根据提交日期和commitid来唯一标识版本)
➜  cat go.mod
module cmdb-job

go 1.12

require github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2 // indirect

## go.sum文件会记录依赖树的详细信息
➜  cat go.sum
github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2 h1:SD6OuR8EUvCmiBDoxItcFYXIMuse45HvuSh3ho0AAeU=
github.com/xxbandy/go-utils v0.0.0-20190506113112-d88d469a26b2/go.mod h1:XhyyBI+KH4XEIbw3EhMFjZfJcV3kDK4iSAT7zZYd+Uc=

Go Module的其他功能

注意:go mod 还有一些其他比较有意思的工具,比如可以打印依赖树,比如可以查看哪些模块在哪些包引用了

go mod的其他特性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 执行go help mod可以查看到以下子命令
➜ go help mod
	download    download modules to local cache       # 下载模块包到本地缓存
	edit        edit go.mod from tools or scripts     # 从工具或脚本中修改go.md内容(暂时没觉得很好用)
	graph       print module requirement graph        # 打印模块依赖树
	init        initialize new module in current directory # 在当前目录初始化一个模块
	tidy        add missing and remove unused modules      # 添加或略或删除不使用的包
	vendor      make vendored copy of dependencies         # 将依赖拷贝到vendor中(会将依赖打包到当前目录下的vendor目录)
	verify      verify dependencies have expected content  # 检查依赖内容
	why         explain why packages or modules are needed # 解释为什么哪些包或者模块被需要


# 查看当前项目的依赖树(项目复杂时比较有用)
➜  go mod graph
cmdb-job github.com/xxbandy/go-utils@v0.0.0-20190506113112-d88d469a26b2
# 查看模块或包在哪里被依赖了
➜  go mod why github.com/xxbandy/go-utils/crypto
# github.com/xxbandy/go-utils/crypto
cmdb-job
github.com/xxbandy/go-utils/crypto

# 拷贝一份依赖到项目本地
# 会将项目的依赖包拷贝到项目的vendor目录中
➜  go mod vendor
➜  tree -L 3 .
.
├── go.mod
├── go.sum
├── main.go
└── vendor
    ├── github.com
    │   └── xxbandy
    └── modules.txt

注意:这个时候可能会有人有疑问了,既然go mod vendor将依赖拷贝一份到项目家目录的vendor目录了,那原始的依赖存在哪里?比如我们之前没有依赖管理之前,默认的依赖都是在$GOPATH/src/下面的

其实,在使用了go mod之后,项目依赖的全部依赖包都会在$GOPATH/pkg/mod/cache/download/中统一缓存下来,而项目中的go.md中会记录真正的版本信息,去缓存中引用即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 查看go mod之后缓存的依赖包
➜  tree -L 3   ${GOPATH}/pkg/mod/cache/download/
${GOPATH}/pkg/mod/cache/download/
└── github.com
    └── xxbandy
        └── go-utils

一个开源项目示例

我们就以golang-gin-vue项目为例来看下go mod的一些功能吧.

golang-gin-vue是一个使用gin框架编写后端接口,结合vue来渲染前端的一个示例项目.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 克隆项目到本地
➜ git clone https://github.com/xxbandy/golang-gin-vue.git

➜  cd golang-gin-vue

# 使用go mod初始化项目
➜  golang-gin-vue git:(master) go mod init golang-gin-vue
go: creating new go.mod: module golang-gin-vue

# 初始化后会默认生成go.mod文件,但是不会加载依赖包,需要go run或者go build来自动加载依赖
➜  golang-gin-vue git:(master) ✗ go build main.go
go: finding github.com/gorilla/mux v1.7.3
go: downloading github.com/gorilla/mux v1.7.3
go: extracting github.com/gorilla/mux v1.7.3

# 查看go.mod文件
➜  golang-gin-vue git:(master) ✗ cat go.mod
module golang-gin-vue
go 1.12
require (
	github.com/gin-gonic/gin v1.4.0 // indirect
	github.com/gorilla/mux v1.7.3 // indirect
)

# 打印依赖树关系
## 基本上可以知道项目和库依赖了哪些库
➜  go mod graph
golang-gin-vue github.com/gin-gonic/gin@v1.4.0
golang-gin-vue github.com/gorilla/mux@v1.7.3
github.com/gin-gonic/gin@v1.4.0 github.com/gin-contrib/sse@v0.0.0-20190301062529-5545eab6dad3
github.com/gin-gonic/gin@v1.4.0 github.com/golang/protobuf@v1.3.1
github.com/gin-gonic/gin@v1.4.0 github.com/json-iterator/go@v1.1.6
github.com/gin-gonic/gin@v1.4.0 github.com/mattn/go-isatty@v0.0.7
github.com/gin-gonic/gin@v1.4.0 github.com/modern-go/concurrent@v0.0.0-20180306012644-bacd9c7ef1dd
github.com/gin-gonic/gin@v1.4.0 github.com/modern-go/reflect2@v1.0.1
github.com/gin-gonic/gin@v1.4.0 github.com/stretchr/testify@v1.3.0
github.com/gin-gonic/gin@v1.4.0 github.com/ugorji/go@v1.1.4
github.com/gin-gonic/gin@v1.4.0 golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c
github.com/gin-gonic/gin@v1.4.0 gopkg.in/go-playground/assert.v1@v1.2.1
github.com/gin-gonic/gin@v1.4.0 gopkg.in/go-playground/validator.v8@v8.18.2
github.com/gin-gonic/gin@v1.4.0 gopkg.in/yaml.v2@v2.2.2
github.com/stretchr/testify@v1.3.0 github.com/davecgh/go-spew@v1.1.0
github.com/stretchr/testify@v1.3.0 github.com/pmezard/go-difflib@v1.0.0
github.com/stretchr/testify@v1.3.0 github.com/stretchr/objx@v0.1.0
github.com/mattn/go-isatty@v0.0.7 golang.org/x/sys@v0.0.0-20190222072716-a9d3bda3a223
gopkg.in/yaml.v2@v2.2.2 gopkg.in/check.v1@v0.0.0-20161208181325-20d25e280405
golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2
golang.org/x/net@v0.0.0-20190503192946-f4e77d36d62c golang.org/x/text@v0.3.0
golang.org/x/crypto@v0.0.0-20190308221718-c2843e01d9a2 golang.org/x/sys@v0.0.0-20190215142949-d0b11bdaac8a

# 查看gin这个模块被哪里需要(golang-gin-vue项目和gin框架本身需要)
➜ go mod why github.com/gin-gonic/gin
# github.com/gin-gonic/gin
golang-gin-vue
github.com/gin-gonic/gin

Tips

我们在使用Golang进行开发过程中,通常会发现各种第三方库会依赖golang.org/x之类的原生库,或者一些其他国外大厂提供的共有库,由于政策原因,我们是无法直接访问国外网站来下载依赖库的(网速也有限制),因此在开发过程中也是比较头疼的. 这个时候通常大家都会去采用访问外国网站,或者通过一些代理的方式来解决. 而在Golang高版本中,包含了goproxy特性,用户可以直接指定代理来下载依赖的第三方库,一方面解决了下载速度的问题,另外一方面也解决了无法访问的第三方库的下载。

注意:goproxy必须在go1.11以上版本,并且开启了go module机制后才能使用的(因为我当前的环境都是1.12,大家可以验证下小版本是否支持)

而在国内,质量比较好的几个goproxy代理大概有如下几个:

go代理使用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 开启go module支持
# golang1.11 需要手动开启,golang1.12之后默认会开启
$ export GO111MODULE=on

# 设置代理(上述三个代理地址都可以)
$ export GOPROXY=https://goproxy.cn

# 下载第三方库

$ go get -v golang.org/x/net/websocket
Fetching https://goproxy.cn/golang.org/x/net/websocket/@v/list
Fetching https://goproxy.cn/golang.org/x/net/@v/list
go: finding golang.org/x/net latest
Fetching https://goproxy.cn/golang.org/x/net/@latest
Fetching https://goproxy.cn/golang.org/x/net/@v/v0.0.0-20190827160401-ba9fcec4b297.mod
golang.org/x/net/websocket
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
使用 Python 按行和按列对矩阵进行排序
假设我们采用了一个输入的 MxM 矩阵。我们现在将使用嵌套的 for 循环对给定的输入矩阵进行逐行和按列排序。
很酷的站长
2023/02/22
6.6K0
使用 Python 按行和按列对矩阵进行排序
C#经典十大排序算法(完结)
冒泡排序算法是一种基础的排序算法,它的实现原理比较简单。核心思想是通过相邻元素的比较和交换来将最大(或最小)的元素逐步"冒泡"到数列的末尾。
追逐时光者
2023/10/25
3400
重学数据结构和算法(五)之归并排序、快速排序
冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是 O(n2),比较高,适合小规模数据的排序。归并排序和快速排序的时间复杂度为 O(nlogn) 。这两种排序算法适合大规模的数据排序
六月的雨
2021/09/26
1.3K0
重学数据结构和算法(五)之归并排序、快速排序
十大经典排序算法最强总结(含Java、Python码实现)
所谓排序,就是使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作。排序算法,就是如何使得记录按照要求排列的方法。排序算法在很多领域得到相当地重视,尤其是在大量数据的处理方面。一个优秀的算法可以节省大量的资源。在各个领域中考虑到数据的各种限制和规范,要得到一个符合实际的优秀算法,得经过大量的推理和分析。
10JQKA
2020/12/31
9690
十大排序算法理解总结
1、时间复杂度:O(n2)O(n^2)O(n2) 2、空间复杂度:O(1)O(1)O(1) 3、稳定排序 4、原地排序
鳄鱼儿
2024/05/21
1370
文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题
首先,为了证明RANDOMIZED-QUICKSORT的期望运行时间是Ω(nlg n),我们需要证明在最坏的情况下,该算法的运行时间是O(nlg n)。然后,我们需要证明在最坏的情况下,算法的期望运行时间是Ω(nlg n)。
福大大架构师每日一题
2023/08/29
3110
文心一言 VS 讯飞星火 VS chatgpt (79)-- 算法导论7.4 4题
归并排序
归并排序是采用分治法的典型应用,而且是一种稳定的排序方式,不过需要使用到额外的空间。
Li_XiaoJin
2022/06/10
2940
归并排序
JavaScript 数据结构与算法之美 - 归并排序、快速排序、希尔排序、堆排序
笔者写的 JavaScript 数据结构与算法之美 系列用的语言是 JavaScript ,旨在入门数据结构与算法和方便以后复习。
夜尽天明
2019/07/30
2.4K0
排序算法-下(Java语言实现)
的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。
acc8226
2022/05/17
4560
排序算法-下(Java语言实现)
快排查找数组中的第K个最大元素
两种时间复杂度为O(nlogn)的排序算法,归并排序和快速排序。这两种排序算法适合大规模数据排序,更常用。
JavaEdge
2021/12/07
4.1K0
快排查找数组中的第K个最大元素
八大排序算法总结与java实现
因为健忘,加上对各种排序算法理解不深刻,过段时间面对排序就蒙了。所以决定对我们常见的这几种排序算法进行统一总结,强行学习。首先罗列一下常见的十大排序算法:
林老师带你学编程
2019/05/27
9160
八大排序算法
​ 八大排序算法是面试经常考到的,尤其是快排,希尔排序和归并也是经常会让写代码的题目,其实只要用一句话说明了他们的原理我们写起代码就没那么困难。 冒泡排序 思想:有 n 个数我们就进行 n-1 趟排序,每一趟我们都选取最大的一个数放到已经排序的位置即可。 伪代码:两个 For 循环,外层表示要进行的趟数,内层则是找出最大的数,找最大的数的方法就是比较、交换。 时间复杂度:O(n2) 空间复杂度:O(n) 代码: package Sorting; import org.junit.jupiter.ap
lwen
2018/04/17
9270
八大排序算法
剑指offer | 面试题38:数组中的逆序对
「归并排序」与「逆序对」是息息相关的。归并排序体现了 “分而治之” 的算法思想,具体为:
千羽
2022/02/23
1K0
剑指offer | 面试题38:数组中的逆序对
排序算法之希尔、归并、堆和基数排序
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/28
5250
Python3实现快速排序、归并排序、堆
# -*- coding: utf-8 -*- # @Time : 2019-03-26 16:46 # @Author : Jayce Wong # @ProjectName : leetcode # @FileName : sorting.py # @Blog : https://blog.51cto.com/jayce1111 # @Github : https://github.com/SysuJayce import random
py3study
2020/01/06
3420
[数据结构与算法] 排序算法之冒泡排序与快速排序(快排)
冒泡排序法 冒泡排序(Bubble Sorting)的基本思想是: 通过对待排序序列从前向后(从下标较小的元素开始),依次比较相邻元素的值,若发现逆序则交换,使值较大的元素逐渐从前移向后部,就象水
时间静止不是简史
2020/07/25
3840
排序算法最强总结及其代码实现(Python/Java)
假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,即在原序列中,r[i]=r[j],且r[i]在r[j]之前,而在排序后的序列中,r[i]仍在r[j]之前,则称这种排序算法是稳定的;否则称为不稳定的。
蛮三刀酱
2019/03/26
5180
排序算法最强总结及其代码实现(Python/Java)
排序进行曲-v2.0
![在这里插入图片描述](https://img-blog.csdnimg.cn/b9733adc7ec9467cb835499ec469cdac.png
学编程的小程
2023/10/11
1840
排序进行曲-v2.0
Python Data Structures - C2 Sort
参考内容: 1.Problem Solving with Python Chapter5: Search and Sorting online_link 2.算法导论
宅男潇涧
2018/08/01
4420
Python Data Structures - C2 Sort
【剑指offer:数组中的逆序对】暴力法、归并排序(JavaScript实现)
时间复杂度是$O(N^2)$。在 leetcode 上会 TLE,无法通过(毕竟这是道标注「困难」的题目)。
心谭博客
2020/04/21
1K0
相关推荐
使用 Python 按行和按列对矩阵进行排序
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档