go语言进阶|青训营笔记

118 阅读3分钟

go语言进阶|青训营笔记

  这是我参与「第五届青训营」笔记创作活动的第二天   项目和作业实现了一下,但是主要是逻辑和细节上的问题,不在知识点部分总结。

  • 1.并发编程
    • 1.0并发与并行

      并发:多线程程序在单核cpu的运行
      并行:多线程程序在多核cpu上运行

    • 1.1Goroutine //协程

      协程:用户态,轻量级线程,栈KB级别

      线程:内核态,线程跑多个协程,MB级别

线程 线程 内核态

协程 协程 协程 协程 协程 用户态

协程的创建
   go func(){
      代码体}()
  • 1.2 CSP 通信共享内存

  • image.png

  • 1.3 channel

    • 定义:make(chan 元素类型,[缓冲大小])
    • 无缓冲通道 make(chan int) //同步通道,接受与发送同步 当面收
    • 有缓冲通道 make(chan int,2) //通道容量即可存放的数据量 类似快递柜的格子
    • eg: 实现顺序性
      • image.png
  • 1.4 并发安全lock 共享内存实现通信

    • sync.MUtex库
    • 使用时先声明 var lock sync.Mutex
    • 利用lock.lock()对临界区进行占用
    • 利用lock.Unlock()解除占用实现运行保护
  • 1.5 WaitGroup

    • 定义 var wg WaitGtoup
    • 方法
      • Add(a int) 计数器+a 开启a个并发
      • Done() 计数器-1
      • Wait() 阻塞直到计数器为0
    1. 依赖管理 Module
    • 2.1 Go依赖管理演进
      • GOPATH->Go Vendor->Go Module
      • 不同项目依赖版本不同
      • 控制依赖库的版本
    • 2.1.1 GOPATH
      • 项目代码依赖src代码
      • go get下载最新版本包到src目录 image.png
    • 缺点:无法实现package的多版本控制
      • 2.1.2 GO Vendor
        • 项目目录下增加vendor文件 所有依赖包副本存放在vendor中
        • 依赖寻址方式 vendor =>GoPATH
        • 解决了多个项目需要同一个package依赖的冲突问题
        • 缺陷:无法控制依赖版本&&更新项目出现依赖冲突
      • 2.1.3 Go Module
        • 通过go.mod 文件管理依赖包版本
        • 通过 go get/go mod 指令工具管理依赖包
    • 2.2 依赖管理三要素
      • 2.2.1 配置文件,描述依赖    go.mod
      • 2.2.2 中心仓库管理依赖库    Proxy
      • 2.2.3 本地工具   go get/go mod
  • 2.3 依赖配置

    • 依赖配置-go.mod
  • 详细见图 image.png

    • 依赖配置 -version
      • 语义化版本 {MAJOR}.${MINOR}.${PATCH} //MAJOR 大版本之间可不兼容,MINOR 增加函数和功能 PATCH 补丁
      • 基于commit伪版本
      • 版本前缀-时间戳-12位hash前缀
    • 依赖配置 -indirect
      • A->B->C A->B直接依赖 A->C间接依赖 用indirect 标识
      • image.png
    • 依赖配置- incompatible
      • 没有go.mod 版本文件并且主版本2+的依赖 +incompatible

image.png 因为 v1.3 v1.4 MAJOR=1相互兼容选择1.4

  • 2.3.5 依赖分发-回源(略)

  • 2.3.6 变量GOPROXY(略)

  • 2.3.7 go get

go get example.org/pkg
 -@update 默认
 -@none 删除依赖
 -@v1.1.2 tag版本,语义版本
 -@23dfdd5 特定的commit
 -@master 分支的最新commit
 
go mod 
  - init 初始化 创建go.mod文件
  - download 下载模块到本地缓存
  - tidy 增加需要的依赖,删除不需要的依赖

image.png

    1. 测试
    • 单元测试
      • 要素:输入,测试单元,输出,期望
        • image.png
      • 保证质量,提升效率
      • 规则
        • 测试文件均以 _test.go结尾
        • func TestXxx(*testing.T)
        • 初始化逻辑放到TestMain中 func TestMain(t *testing.M)
        • 测试命令 test ./TestXxx.fo Xxx.fo
          • image.png
      • 例子 //测试实现与assert包
       func HelloTom() string {
          return "Tom"
      }
      
       func TestHelloTom(t *testing.T) {
          output := HelloTom()
          expectOutput := "Tom"
          assert.Equal(t, expectOutput, output)
       }
      
      • 覆盖率:测试项目覆盖的原文件的代码比例
        • go test TestXxx.fo Xxx.fo --cover //求覆盖率
      • 测试依赖
        • 幂等->多测测试结果相同
        • 稳定->各中环境均可实现,不依赖环境
        • 若测试文件被删则无法实现不稳定
      • Mock
        • 为一个函数或者方法打桩 //用函数B替代函数A(原函数)
        • monkey包
        • image.png
        • image.png
    • 基准测试(没有太明白)   go test -bench=. [-- run=函数名] 测试文件 目标测试文件 //测试命令

  注意在windows环境下 go test -bench="." [-- run=函数名] 测试文件 目标测试文件 才能执行

标题:Go 语言进阶与依赖管理 - 掘金

网址:juejin.cn/course/byte…