Go语言进阶与依赖管理 | 青训营笔记

43 阅读4分钟

1. Go语言进阶

  1. 并行与并发

    • 并发:多线程程序在一个核的cpu运行(宏观上看是同时执行,微观上看是交替执行)
    • 并行:多线程程序在多个核的cpu运行(有多个核,相当于有多个服务员,故可以同时进行)
    • Go可以重复发挥多核优势
  2. 进程、线程、协程

    1. 进程
      • 进程是程序一次动态执行的过程,是程序运行的基本单位。
      • 每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。
      • 进程占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、页表、文件句柄等)比较大,但相对比较稳定安全。协程切换和协程切换
    2. 线程 MB
      • 线程又叫做轻量级进程(内核态),是CPU调度的最小单位
      • 线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也可以有更多的子线程
      • 多个线程共享所属进程的资源,同时线程也拥有自己的专属资源。
      • 程间通信主要通过共享内存,上下文切换很快,资源开销较少,但相比进程不够稳定容易丢失数据。
    3. 协程 KB
      • 协程是一种用户态的轻量级线程,协程的调度完全由用户控制
      • 一个线程可以拥有多个协程,协程不是被操作系统内核所管理,而完全是由程序所控制。
      • 与其让操作系统调度,不如我自己来,这就是协程
      • 开启协程:在调用函数前+go
      • 协程间的通信:Go提倡通过通信共享内存而不是通过共享内存(同时操作一个内存,性能下降)而实现通信 图例:image.png 原文链接:blog.csdn.net/qq_39304851…
  3. channel

    • 如果说goroutine是Go程序并发的执行体,channel就是它们之间的连接。channel是可以让一个goroutine发送特定值到另一个goroutine的通信机制。
    • 创建格式: make(chan 元素类型,[缓冲大小])
    • 类型
      • 无缓冲通道,又称同步通道(无缓冲通道进行通信将导致发送和接收的goroutine同步化) make(chan int)
      • 有缓冲通道 make(chan int,2),可以解决生产者-消费者的速度不匹配问题 1683971468870.png
  4. 并发安全Lock

    • 涉及到临界资源、临界区,类似在进入临界区之前检查变量是否为1
    • 加锁确保内存不会被同时操作而导致的并发问题
    • Go的加锁 1683972361536.png
  5. WaitGroup

    • sleep可以暴力阻塞
    • 方法
      • Add(delta int)计数器+delta
      • Done()计数器-1
      • Wait()阻塞直到计数器为0,即并发任务完成了

2. 依赖管理

  1. GOPATH
    • 弊端:无法实现package的多版本控制
  2. Go Vendor
    • 弊端:无法控制版本的依赖;更新项目又可能出现依赖冲突,导致编译出错
  3. Go Module
    • 依赖配置三要素
      1. 配置文件,描述依赖go.mod
      2. 中心仓库管理依赖库Proxy image.png
      3. 本地工具- go get / go mod

3. 测试

  1. 单元测试 image.png
    • 覆盖度,即已运行代码占总代码的比例。覆盖度越高越好,但一般都在50%~60%
    • 依赖,要实现幂等&稳定 -> Mock
  2. Mock(有外部依赖时,保证单元测试的稳定性)
    • monkey包:guthub.com/bouk/monkey
    • 快速Mock函数
      • 打桩:用一个函数/方法替换掉原来的
      • 为一个函数/方法打桩
  3. 基准测试(分析性能指标时,通过本地测试比较方便)

小结

进阶课程的一些内容跟上学期学习的操作系统课程有些相似,通过多线程的学习也可以更好的理解“进程、线程”,今天才知道还有“协程”这东西。对进程、线程、协程大概的关系理解为:进程>线程>协程,通过上述的图例也能比较清晰的认知。
感觉自身的不足在:除了对语言格式、代码比较浅层的理解外,像依赖、测试(虽然前段时间也有为了找测试实习自学过,但是感觉跟老师不一样,一个偏向于工具,一个偏向于代码)、形成http服务器等就看着有点懵。
害,菜鸡的第二天!