这是我参与「第五届青训营 」伴学笔记创作活动的第 3 天

前语

记载参加青训营的每一天的日笔记

背景

开发项目时应学会站在巨人的膀子上,即有效运用开发组件进行或东西提高自己的研制效率

关于较简略的单体函数而言,只需求依靠原生的SDK即可完结开发

关于实际开发的工程较于杂乱,应将精力投放在完成的业务逻辑之上

  • 工程项目不可能基于标准库0-1编码建立
  • 办理依靠库

GOPATH 形式

GOPATH为环境变量 包括bin、pkg、src三部分

$GOPATH:项目根途径

  • src:项目源代码
  • bin:项目编译的二进制文件 可执行程序
  • pkg:项目编译的中间产品 加速编译 第三方依靠包

运转方式:

一切工程代码要求放在GOPATH/src目录下 工程本身也将作为一个依靠包,能够被其它 GOPATH/src 目录下的工程引证 在 $GOPATH/src下进行 .go 文件或源代码的存储,咱们能够称其为 GOPATH 的形式

缺陷:

  • 没有版别控制的概念
  • 一切项目都要放在$GOPATH/src目录下,不在当时目录则不能编译

GO Vendor形式

解决 GOPATH形式 一切项目都在$GOPATH/src目录的问题 能够随处能够创立项目,不必扎堆 src 目录下

原理:本地化构建

在每个项目下都创立一个vendor目录,每个项目所需求的以来都会下载到自己的vendor目录下。在运用包时,会先从当时项目下的vendor目录查找,然后再从GOPATH中查找,都没有找到最后才在GOROOT中查找(依靠寻址方式:vendor -> GOPATH)

缺陷:

  • 放弃了依靠重用,使得冗余度上升
  • 无法控制依靠的版别 更新项目可能呈现依靠冲突 导致编译出错

Go Module形式

1.16版别后默许开启的形式

经过go.mod文件办理依靠的版别

经过go get/go mod指令东西办理依靠包

工程不必全放在gopath/src目录下

界说版别规则和办理项目依靠关系

主要改动:

  • GO MODULE形式下一切依靠的包存放在$GOPATH/pkg/mod目录下
  • 项目中需求有go.mod文件,来运用$GOPATH/pkg/mod

依靠办理三要素

  • 装备文件 描绘依靠 go.mod
  • 中心仓库办理依靠库 Proxy
  • 本地东西 go get/mod

依靠装备 go.mod

module example.com/foobar
​
go 1.16
​
require (
  example.com/apple v0.1.2
  example.com/banana v1.2.3
  example.com/banana/v2 v2.3.4
  example.com/pineapple v0.0.0-20190924185754-1b0db40df49a
)
​
exclude example.com/banana v1.2.4
replace example.com/apple v0.1.2 => example.com/rda v0.1.0 
replace example.com/banana => example.com/hugebanana

go.mod 是启用了 Go moduels 的项目所必须的最重要的文件,它描绘了当时项目(也就是当时模块)的元信息,每一行都以一个动词开头,现在有以下 5 个动词:

  • module:用于界说当时项目的模块途径。
  • go:用于设置预期的 Go 版别。
  • require:用于设置一个特定的模块版别。
  • exclude:用于从运用中排除一个特定的模块版别。
  • replace:用于将一个模块版别替换为别的一个模块版别。

这里的填写格局基本为包引证途径+版别号,别的比较特别的是 go $version,现在从 Go1.16 的代码里来看,还只是个标识效果,暂时未知未来是否有更大的效果。

go mod指令

常用的go mod指令如下:

go mod download  下载依靠的module到本地cache(默许为$GOPATH/pkg/mod目录)
go mod edit    修正go.mod文件
go mod graph    打印模块依靠图
go mod init    初始化当时文件夹, 创立go.mod文件
go mod tidy    添加短少的module,删去无用的module
go mod vendor   将依靠复制到vendor下
go mod verify   校验依靠
go mod why     解释为什么需求依靠 

go get指令

在项目中执行go get指令能够下载依靠包,而且还能够指定下载的版别。

  • 运转go get -u将会升级到最新的非必须版别或许修订版别(x.y.z, z是修订版别号, y是非必须版别号)
  • 运转go get -u=patch将会升级到最新的修订版别
  • 运转go get package@version将会升级到指定的版别号version 假如下载一切依靠能够运用go mod download指令。

快速运用go module

  • SET GOPROXY=goproxy.cn (这是win环境下的) export GOPROXY=goproxy.cn (这是mac环境下的)
  • go mod init [包名] // 初始化项目(假如你是初始化项目直接 go mod init 就好了)
  • 在目录文件下会生成go.mod和go.sum文件 go.mod 里边包括了一切的包!
  • 在文件里边引入包名的时分有的修正器会报错可是是能够正常编译的
  • 下载包运用go get
  • 修正包的版别号直接去go.mod文件修正然后go mod download

小结

今日学习到的内容还需求进一步的消化,我也是计划将并发编程这一块的内容熟悉透彻了再进行下一部分的课程学习。假如笔记中有过错的地方也期望掘友们能够及时的提出纠正。