Go Modules模式

2023-05-16

Go Modules模式

(1)go mod 命令

命令作用
go mod init生成 go.mod 文件 / 在当前文件夹下初始化一个新的 go.mod 文件
go mod download下载 go.mod 文件中指明的所有依赖 / 下载依赖的module到本地cache
go mod tidy整理现有的依赖 / 增加失去的 module,去掉未用的module
go mod graph查看现有的依赖结构
go mod edit编辑 go.mod 文件
go mod vendor导出项目所有的依赖到 vendor 目录 / 将依赖复制到vendor下
go mod verify校验一个模块是否被篡改过 / 校验依赖,检查下载到第三方库有没有本地修改,如果有修改,则返回非0,否则验证成功。
go mod why查看为什么需要依赖某模块 / 解释为什么需要需要依赖

(2)go mod 环境变量

可以通过 go env 命令来进行查看

GO111MODULE="on"
GOPROXY="https://goproxy.cn,direct"
GOROOT="..."
GOSUMDB="sum.golang.org"
GOTMPDIR=""
...

GO111MODULE

Go 语言提供了GO111MODULE这个环境变量来作为 Go modules 的开关,其允许设置以下参数:

  • auto:只要项目包含了 go.mod 文件的话启用 Go modules。
  • on:启用 Go modules,推荐设置。
  • off:禁用 Go modules,不推荐。

可以通过 go env -w GO111MODULE=on 来设置。

GOPROXY

这个环境变量主要是用于设置 Go 模块代理(Go module proxy),其作用是用于使 Go 在后续拉取模块版本时直接通过镜像站点来快速拉取。

  • GOPROXY 的默认值是:https://proxy.golang.org,direct
  • proxy.golang.org 国内访问不了,需要设置国内的代理
    • 阿里云:https://mirrors.aliyun.com/goproxy/
    • 七牛云:https://goproxy.cn,direct
go env -w GOPROXY=https://proxy.golang.org,direct

direct的含义:指示符。指示go回源到模块版本的原地址去拉取。

比如一个模块 “github.com/xxx/json”,首先会到https://proxy.golang.org中去抓取,如果找不到,会去github.com/xxx/json源本身去拉取。

--------### GOPRIVATE

GONOPROXY/GONOSUMDB/GOPRIVATE,通过设置GOPRIVATE即可。

设置方式:

go env -w GOPRIVATE="git.example.com,github.com/aceld/zinx"
# git.example.com 比如是公司内部的仓库的名称,或者是私有仓库
# 设置了这个参数,即当我们导包的时候,不会去GOPROXY的地址下载,即设置了GOPRIVATE,会覆盖GOPROXY和GOSUMDB
# 可以通过通配符去设置 

go env -w GOPRIVATE="*.example.com"
# 凡是这个后缀的模块路径,都会走这个私有仓库,不会经过GOPROXY

或者通过 Linux export 环境方式也可以设置


使用 Go Modules 初始化项目

(1)开启 Go Modules

go env -w GO111MODULE=on

又或是可以通过直接设置系统环境变量(写入对应的~/.bash_profile 文件亦可)来实现这个目的:

export GO111MODULE=on

(2)初始化项目

创建项目目录

mkdir -p $HOME/aceld/modules_test
cd $HOME/aceld/modules_test

执行 Go modules 初始化

go mod init github.com/aceld/modules_test
# github.com/aceld/modules_test —— 这个名称决定了你导包的名称,是你本项目的名称
# 创建了一个 go.mod 文件,出现这个,表示创建成功

在执行 go mod init 命令时,我们指定了模块导入路径为 github.com/aceld/modules_test。接下来我们在该项目根目录下创建 main.go 文件,如下:

vim main.go

内容为:

import (
	"fmt"
	"github.com/aceld/zinx/ziface"
	"github.com/aceld/zinx/znet"
)

//ping test 自定义路由
type PingRouter struct {
	znet.BaseRouter
}

//Ping Handle
func (this *PingRouter) Handle(request ziface.IRequest) {
	//先读取客户端的数据
	fmt.Println("recv from client : msgId=", request.GetMsgID(), ", data=", string(request.GetData()))

    //再回写ping...ping...ping
	err := request.GetConnection().SendBuffMsg(0, []byte("ping...ping...ping"))
	if err != nil {
		fmt.Println(err)
	}
}

func main() {
	//1 创建一个server句柄
	s := znet.NewServer()

	//2 配置路由
	s.AddRouter(0, &PingRouter{})

	//3 开启服务
	s.Serve()
}

下载包

(base) ➜  modules_test ls
go.mod  main.go
(base) ➜  modules_test pwd  
/Users/username/aceld/modules_test
(base) ➜  modules_test go get github.com/aceld/zinx/znet
go: downloading github.com/aceld/zinx v1.0.1
go: added github.com/aceld/zinx v1.0.1
(base) ➜  modules_test go get github.com/aceld/zinx/ziface

生成 go.sum

启动程序

go run main.go

现在的 go.mod 文件内容:

module github.com/aceld/modules_test

go 1.18

require github.com/aceld/zinx v1.0.1 // indirect
// 导入的包。  版本号。 indirect:表示间接依赖,在代码中依赖的是zinx下的ziface和znet,并没有依赖zinx本身

go.sum 文件:作用是当前的库是完整的库,校验是正确的。

表示依赖的模块名称、版本号、h1+hash(go.mod h1+hash)

  • h1+hash(没有go.mod):表示将目标文件的zip压缩包打开之后,针对所有文件校验和来生成的hash(库里所有的包的值统一做哈希,保证所有文件的完整性)
    • 如果不存在,可能表示依赖到库可能用不上
  • go.mod h1+hash:对mod做了哈希

下载的包实际上被下载到哪儿了呢?

/Users/username/goproject/pkg/mod/github.com/aceld/zinx@v1.0.1

修改项目模块的版本依赖关系

go mod edit -replace=zinx@1.1.0=zinx@1.2.0

安装包

1、go get (全局)

  • 受网络原因限制

2、go download (全局)

依赖包会自动下载到 $GOPATH/pkg/mod,多个项目可以共享缓存的mod,注意使用go mod download 的时候首先需要在你的项目里面引入第三方包。

3、go mod vender(本项目)(主用)

  • 将依赖复制到当前项目的vendor下(本项目)

【注意】

使用 go mod vendor 的时候首先需要在你的项目里面引入第三方包

函数init执行顺序

init函数会自动执行

main => import A => import B => import C
C.init() => B.init() => A.init() => main.init()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Go Modules模式 的相关文章

  • 学习c语言

    今天学习了if语句和 xff45 xff4c xff53 xff45 运用 xff43 语言更加顺手 xff0c 之前一些都能实施 xff0c 真是太开心了 include lt stdio h gt int main 初始化 int pr
  • 求符合给定条件的整数集(做题)

    题目如上 xff1b 首先我们先想思路 xff1a 先来一个输入 xff0c 读入这个数 xff0c 然后我们需要三个变量来储存这三个数 xff1b 然后我们遍历所有的组合 xff0c 这个依靠循环 接下来是代码 xff1a include
  • 水仙花数(做题)

    代码如下 xff1a include lt stdio h gt int main int a scanf 34 d 34 amp a float t t 61 0 1 while a gt 0 t 61 t 10 a 判断几位数 int
  • 一分钟了解动态内存分配

    谈到这 xff0c 必然离不开malloc函数 在上面可以看出此函数需要一个头文件 include lt stdilb h gt 而且返回类型是void 传进去的是空间大小 xff0c 此函数申请的空间是字节为单位的 这其中的就分配了100
  • 动态内存分配深究

    接下来我们将探究以下三个问题 xff1a 1 相邻两次malloc得到的空间是否是连续的呢 xff1f 2 你得到的空间的实际大小是否就是你要求的大小呢 xff1f 3 如果你malloc零长度会得到什么结果呢 xff1f 第一个问题 xf

随机推荐

  • 同一个页面不打开两次

    lt script language 61 34 javascript 34 gt function popwin3 path window open path 34 cart 34 34 height 61 520 width 61 52
  • 超易懂!二分查找 详析

    二分算法的 本质 是 xff1a 假如我们可以找到事物的 某种性质 xff0c 这种性质 可以将区间一分为二 xff0c 一半满足 xff0c 一半不满足 我们就可以二分 另外 xff0c 有 连续性 必可以 二分 二分模板一共有两个 xf
  • 手摸手 Spring Cloud Gateway + JWT 实现登录认证

    你好 xff0c 我是悟空 前言 上篇我已经讲解了 Spring Cloud 的原理和实战 xff0c 这次就要结合 JWT 来实现登录认证的功能了 本文已收录至 深入剖析 Spring Cloud 底层架构原理 xff0c 已更新 18
  • 百行代码实现VLC简易视频播放器【VLC环境配置过程+可执行源码注释完整】

    文章目录 什么是VLC x1f680 VLC 库的集成 VLC环境配置演示 win10系统 43 vs2017 43 win64 x1f34e VLC 库的基本使用 x1f382 视频播放器实现 自定义函数Unicode2Utf8讲解 x1
  • HttpWebRequest 使用NetworkCredential 进行域认证下载时不成功 的解决方案

    最近在项目中使用pWebRequest 使用NetworkCredential 进行域认证下载时老不成功 xff0c 最后Google了解决方案 xff0c 发现几乎所有讨论的方案都不成功 xff0c 只好埋头自己解决 xff0c 最后总算
  • Firefox 的用户脚本管理器 greasemonkey 的使用一例

    一 什么是greasemonkey Firefox 的用户脚本管理器 greasemonkey 使你可以向任何网页添加DHTML语句 用户脚本 来改变它们的显示方式 就像CSS可以让你接管网页的样式 xff0c 而用户脚本 User Scr
  • Apache Http 服务器安装教程

    我在学习网络开发的时候需要从服务器上获得json数据 xff0c 所以在自己的电脑上安装了一个本地服务器 xff0c 其中遇到的一些问题 xff0c 在这里都写出来 首先 xff0c 我们需要访问apache http服务器的下载网页 xf
  • STM32的UART奇偶校验注意

    STM32的UART奇偶校验注意 STM32的UART在初始化时 xff0c 我们通常用到最多的就是无校验位 xff0c 1停止位 但是我在项目中也遇到某些芯片通信用的需要奇校验或者偶校验 xff0c 这里需要特别注意的是STM32中开启奇
  • Realtek RTL8762C/Realtek RTL8762D学习记录

    本人基于日常工作整理编写的8762C FAQ文档 xff0c 记录RTL8762C 8762D系列软件开发常见问题以及解决方案 希望它能发挥更多作用 帮到有需要的朋友 关键字 xff1a 8762CMF 8762CK 8762CJ 8762
  • 蓝牙BLE---DA14683的SPI主机通信讲解

    DA14683的SPI主机通信例程 Date 2018 12 19 Create Jim 导入例程 首先导入ble peripheral例程或者pxp reporter例程 再到以下位置打开硬件SPI的宏定义 xff1a 获取SPI例程源码
  • 06.5 Code

    06 5 Code 推力 force 推力的应用旋翼的气动阻力空气阻力矩滚转力矩电机的转速 推力 force span class token comment force 61 电机的转速 xff5c 电机的转速 xff5c xff08 带
  • C、C++ 对于char*和char[]的理解

    1 char 和char 的共同点 都是指针 xff0c 指向第一个字符所在的地址 2 char 的用法 char a 61 34 aaa 34 char p1 61 a char 是常量指针 xff08 常量的指针 xff09 xff0c
  • 重新抛出(rethrow)

    有可能单个catch不能完全处理一个异常 在进行了一些校正行动之后 xff0c catch可能确定该异常必须由函数调用链中更上层的函数来处理 xff0c catch可以通过重新抛出 rethrow 将异常传递给函数调用链中更上层的函数 重新
  • 4-2 图像聚类算法

    4 2 图像聚类算法 目录1 分类与聚类1 1 分类1 2 聚类1 3 聚类样本间的属性1 4 聚类的常见算法 2 K Means聚类2 1 概念2 2 步骤2 3 例子2 4 K Means聚类与图像处理2 5 K Means聚类优缺点优
  • JavaWeb-03 统一字符集编码、JSP的页面元素、JSP九大内置对象-request

    1 使用Eclipse开发Web项目 JSP项目 tomacat 2 在Eclipse中创建的Web项目 xff1a 浏览器可以直接访问WebContent中的文件例如 http 127 0 0 1 8888 MyJspProject in
  • 9-1 从零开始训练网络

    9 1 从零开始训练网络 目录1 搭建网络基本架构要完成的功能 2 构建训练网络1 实现网络训练功能2 获取训练数据及预处理 3 启动训练网络并测试数据 目录 搭建网络基本架构构建训练网络启动训练网络并测试数据 1 搭建网络基本架构 要完成
  • 基于知识图谱的推荐系统

    基于知识图谱的推荐系统 推荐系统 xff1a 核心目标是通过分析用户行为 兴趣 需求等信息 在海量的数据中挖掘用户感兴趣的信息 如商品 新闻 POI point of interest 和试题 等 个性化推荐算法是推荐系统的核心 其主要可以
  • mysql级联删除

    mysql级联删除 场景 xff1a 员工表 id xff1a 员工idleader id xff1a 该员工的领导的id xff08 也是员工id xff09 外键dept id xff1a 该员工的部门id xff08 部门表外键 xf
  • 【Seata】安装 - mac

    1 下载 官网 xff1a https seata io zh cn index html 2 修改配置文件 2 1 file conf 还有user password 2 2 registry conf 1 xff09 registry
  • Go Modules模式

    Go Modules模式 xff08 1 xff09 go mod 命令 命令作用go mod init生成 go mod 文件 在当前文件夹下初始化一个新的 go mod 文件go mod download下载 go mod 文件中指明的