第一篇Go笔记——配置及依赖管理使用 | 青训营

96 阅读3分钟

Go介绍

简介

  1. Go 是一个开源的编程语言,它能让构造简单、可靠且高效的软件变得容易。
  2. Go 语言被设计成一门应用于搭载 Web 服务器,存储集群或类似用途的巨型中央服务器的系统编程语言。
  3. 对于高性能分布式系统领域而言,Go 语言无疑比大多数其它语言有着更高的开发效率。它提供了海量并行的支持,这对于游戏服务端的开发而言是再好不过了。

特性

  1. 高性能、高并发(大量客户点击一个内容)
  2. 语法简单、学习曲线平缓(简单快速)
  3. 丰富的标准库
  4. 完善的工具链
  5. 静态链接
  6. 快速编译()
  7. 垃圾回收(这点和Java一样,无需关心内存的释放)

与Java、C++对比

  1. 语法更简单
  2. 开发效率更高
  3. 摈弃了部分C++复杂的指针,但相对于Java(完全摈弃)保留了地址传递的功能
  4. 和Java一样,有垃圾回收机制,无需担心内存泄露,C++没有

Go环境配置

见教程

Go创建项目

屏幕截图 2023-07-25 205950.png屏幕截图 2023-07-25 210053.png

Go依赖管理

依赖管理的发展过程

go依赖管理经历了三个阶段 GOPATH ==> Go Vendor ==> Go Module

GOPATH

  1. $GOPATH 是配置时需要的环境变量,表示go语言workspace
  2. GOPATH 指定目录下会自动生成三个重要目录(所有项目共用)
    • bin——二进制文件
    • pkg——项目编译产生的中间产物
    • src——项目源码(包括各依赖的源码)
  3. 如果有依赖更新,则可使用go get 下载最新版本依赖到src目录下
  4. 缺点:不同的两个项目依赖同一个依赖包,但是是不同版本的,src中的依赖旧版本会被新版本代替,因此,造成了冲突。
  5. 问题:如何实现不同项目间package的多版本依赖

Go Vendor

  1. 在GOPATH阶段的基础上,为每一个项目增加一个目录vendor,路径为$ProjectRoot/vendor
  2. vendor 里面存放依赖的副本,寻找依赖的顺序 vendor(×没有)==》src
  3. 解决了多个项目依赖同一个包的多版本问题
  4. 缺点:同一个项目下的两个包依赖同一个依赖包的不同版本,vendor中的依赖旧版本会被新版本代替,因此,造成了冲突。

Go Module

  1. 通过 go.mod 文件管理依赖包版本
  2. 通过 go get/go mod 指令工具管理依赖包

依赖管理细节

依赖管理三要素

  1. go.mod 配置文件,描述依赖
  2. Proxy 中心仓库管理依赖库
  3. go get/mod 本地工作

依赖配置——go.mod

  1. go.mod三个重要组成

image.png

  • 单元依赖标识 Module-Path Version
  1. 依赖版本——version
    1. 语义化版本:aa.bb.cc
    • aa表示主版本,不同aa可以不兼容
    • bb表示新增函数/功能,在aa相同情况下,不同bb要保持兼容
    • cc表示补丁/修复,保持兼容
    1. commit伪版本:vx.0.0-yyyymmddhhmmss-hsssxhhksjdh(乱码)
    • vx.0.0——版本
    • yyyymmddhhmmss——年月日时分秒
    • hsssxhhksjdh(乱码)——12位hash码前缀
  2. 关键字——indirect

使用// indirect的版本表示其直接依赖没有导入

  1. 关键字——incompatible
  • 对于主版本大于等于2的依赖,其Module-Path后面增加/vN后缀
  • 对于没有 go.mod 文件并且主版本2+的依赖,会 在最后版本+incompatible,表示可能存在不兼容的代码逻辑

依赖分发

回源

  • 依赖分发——项目完成后通常会打包上传到第三方仓库
  • 回源——项目修改/增加,从第三方托管平台获取源码依赖
  • 存在问题:
    1. 无法保证构建稳定性:第三方仓库可能增加/修改/删除软件版本
    2. 无法保证依赖可用:删除软件
    3. 增加第三方压力:代码托管平台负载问题

Proxy

  1. GOPROXY配置

GOPROXY="proxy1.cn,http://proxy2.cn,…"

  • GOPROXY是一个url列表,url都是访问各个proxy,顺着列表找依赖
  • direct——如果前面的url对应的proxy里面都没有依赖,则回到源站即第三方仓库

工具——go get/mod

  1. 常用指令及对应功能

image.png
image.png

  1. 个人总结实践下的使用
  • go mod init 的使用会在一个文件夹下创建一个go.mod文件,此文件用于管理外部依赖包的版本,此时,该文件夹下,禁止存在同名函数
  • 当需要导入外部依赖包时,先import 该依赖链接,然后在终端输入 go get xxx/xxx/。。。 ,在此之前需要确保,当前文件夹下有go.mod文件
  • VScode中右键Running code 实际等同于 go run xxx.go;如果是测试文件,则在终端,文件夹路径下go test xxx_test.go