使用 Go Modules 管理依赖:简明教程

一、GoLang 中包的介绍和定义

  • 包(package)是多个 Go 源码的集合,是一种高级的代码复用方案
  • Go 语言为我们提供了很多内置包,如 fmt、strconv、strings、sort、errors、times、encoding/json、os、io 等
  • Golang 中的包可以分为三种,1、系统内置包2、自定义包3、第三方包
    1. 系统内置包
      1. fmt、strconv、strings、sort、errors、time、encoding/json、os、io 等
    2. 自定义包
      1. 开发者自己写的包
    3. 第三方包
      1. 属于自定义包的一种,需要下载安装到本地后才可以使用

二、GoLang 包管理工具 go mod

  • 在 Golang1.11 版本之前如果我们摇自定义包的话必须把项目放在 GOPATH 目录
  • Go1.11版本之后无需手动配置环境变量,使用 go mod 管理项目
  • 也不需要非得吧项目放到 GOPATH 指定目录下,你可以在你磁盘的任何位置新建一个项目
  • Go1.13 以后可以切滴不要 GOPATH 了
1、go mod init 初始化项目
  • 实际项目开发中我们首先要在我们项目目录中用 go mod命令生成一个go.mod文件管理我们项目的依赖
  • 比如我们的 golang 项目文件要放在了 itying 这个文件夹,这个时候我们需要在 itying 文件里面使用 gomode 命令生产一个 go.mod文件
  • go.mod文件一旦创建后,它的内容将会被 go toolchain 全面掌控
  • go toolchain 会在各类命令执行时,比如 go get、go build、go mod 等修改和维护 go.mod文件
  • go.mod提供了 module,require、replace 和 exclude 四个命令
    • module 语句指定包的名字(路径)
    • require 语句指定的依赖项模块
    • replace 语句可以体会依赖项模块
    • exclude 语句可以忽略依赖项模块
2、go mod 常用命令

|----------|---------------------------------------------------------|
| 命令 | 说明 |
| download | download modules to local cache(下载依赖包) |
| edit | edit go.mod from tools or scripts(编辑go.mod) |
| graph | print module requirement graph (打印模块依赖图) |
| verify | initialize new module in current directory(在当前目录初始化mod) |
| tidy | add missing and remove unused modules(拉取缺少的模块,移除不用的模块) |
| vendor | make vendored copy of dependencies(将依赖复制到vendor下) |
| verify | verify dependencies have expected content (验证依赖是否正确) |
| why | explain why packages or modules are needed(解释为什么需要依赖) |

三、GoLang 中自定义包

  • 包(package)是多个 Go 源码的集合,一个包可以简单理解为一个存放多个.go文件的文件夹
  • 改文件夹下面的所有 go 文件都要在代码的第一行添加如下代码,声明改文件归属的包

package 包名

1、初始化项目

mkdir Demo

cd Demo

go mod init Demo

2、Demo/calc/calc.go
Go 复制代码
package main

import {
    c "Demo/calc"    // c是取的别名
	"fmt"
}

func main() {
	sum := c.Add(10, 2)
	fmt.Println(sum)                  //12
	sub := c.Sub(10, 2)
	fmt.Println(sub)                  // 8
}
func init() {   //main包中init函数 优先于 main函数
	fmt.Println("main init...")
}
/*
main init...
12
8
 */

四、init()初始化函数

1、init()函数介绍
  • 在 Go 语言程序执行时导入包语句会自动触发包内部 init()函数的调用
  • 需要注意的是:init()函数没有参数也没有返回值
  • init()函数在程序运行是自动被调用执行,不能在代码中主动调用它
2、init()函数执行顺序
  • Go 语言包会从 main 包开始检查其导入的所有包,每个包中又可能导入了其他的包
  • Go 编译器由此构建出一个树状的包引用关系,再根据引用顺序决定编译顺序,依次编译这些包的代码
  • 在运行时,被最后导入的包会最先初始化并调用奇 inti()函数,如下图示

五、Golang 中使用第三方包

1、查找 golang 的第三方包
2、安装这个包
  • 第一种方法:go get 包名称(全局)
Go 复制代码
go get github.com/shopspring/decimal
  • 第二种方法:go mod download (全局)
    • 依赖包会自动下载到$GOPATH/pkg/mod,多个项目可以共享缓存的 mod
    • 注意使用 go mod download 的上海首先需要在你的项目里面引入第三方包
Go 复制代码
go mod  download
  • 第三种方法:go mod vendor 将依赖复制到当前项目的 vendor 在(本项目)
    • 将依赖复制到当前项目的 vendor 下
    • 注意:使用go mod vendor的时候首先需要在你的项目里面引入第三方包
Go 复制代码
go mod vendor
3、看文档使用这个包
  • 包安装完毕后我们就可以看文档使用这个包了..
相关推荐
Qter_Sean3 分钟前
自己动手写Qt Creator插件
开发语言·qt
何曾参静谧7 分钟前
「QT」文件类 之 QIODevice 输入输出设备类
开发语言·qt
爱吃生蚝的于勒1 小时前
C语言内存函数
c语言·开发语言·数据结构·c++·学习·算法
码上一元2 小时前
SpringBoot自动装配原理解析
java·spring boot·后端
小白学大数据3 小时前
Python爬虫开发中的分析与方案制定
开发语言·c++·爬虫·python
冰芒猓4 小时前
SpringMVC数据校验、数据格式化处理、国际化设置
开发语言·maven
失落的香蕉4 小时前
C语言串讲-2之指针和结构体
java·c语言·开发语言
jerry6094 小时前
7天用Go从零实现分布式缓存GeeCache(改进)(未完待续)
分布式·缓存·golang
枫叶_v4 小时前
【SpringBoot】22 Txt、Csv文件的读取和写入
java·spring boot·后端
红中马喽4 小时前
JS学习日记(webAPI—DOM)
开发语言·前端·javascript·笔记·vscode·学习