后端课程:go语言进阶与依赖管理 | 豆包MarsCode AI 刷题

42 阅读2分钟

本文对第二节课程:go语言进阶与依赖管理,中的知识点进行了简要的梳理。

1.并发VS并行

  • 并发:多线程程序在一个核的cpu上运行
  • 并行:多线程程序在多个核的cpu上运行
    • Go可以充分发挥多核优势,高效运行

2.Goroutine协程

  • 协程:用户态,轻量级线程,栈KB级别
  • 线程:内核态,线程跑多个协程,栈MB级别
  • 只需在函数前加go关键字

3.CSP协程之间通信

  • 提倡通过通信来共享内存而不是通过共享内存来实现通信

1.png

  • channel通道
    • 引用类型,创建需通过make关键字
    • 根据缓冲大小分类
      • 无缓冲通道 make(chan int)
        • 是同步通道
      • 有缓冲通道 make(chan int, 2)
        • 考虑消费速度小于生产速度
  • 并发安全 Lock
    • 临界区
  • WaitGroup 实现并发任务的安全
    • 内部实现一个计数器
      • Add(delta int) 计数器+delta
      • Done 计数器-1【每个任务完成时】
      • Wait 【阻塞】直到计数器为0,0表示所有并发任务已完成

4.依赖管理

  • 发展:gopath->go vender->go module
  • 环境变量GOPATH
    • 包括
      • bin 项目编译的二进制文件
      • pkg 项目编译的中间产物,加速编译
      • src 项目源码
    • 弊端
      • 两项目都依赖某个pkg,但需要pkg的不同版本
      • 无法实现package的多版本控制
  • Go Vender
    • 项目目录下增加vender文件:所有依赖包副本形式放在$ProjectRoot/vender
    • 依赖寻址方式
      • 先找vender,若没有,再找gopath
      • vender=>GOPATH
    • 通过每个项目引入一份依赖的副本,解决问题
    • 弊端
      • 若项目分别依赖pkg A 和B,A依赖pkg C 的v1版本,B依赖pkg C 的v2版本,两版本不兼容,出问题
      • 无法控制依赖的版本
      • 更新项目又可能出现依赖冲突,导致编译出错
  • Go Module
    • 通过 go.mod文件 管理依赖包版本
    • 通过go get/go mod指令工具 管理依赖包
    • 目标:定义版本规则和管理项目依赖关系
    • 依赖管理三要素
      • 1.配置文件,描述依赖 go.mod
      • 2.中心仓库管理依赖库 Proxy
      • 3.本地工具 go get/mod
    • 依赖配置
      • -go.mod
      • -version
        • 语义化版本
        • 基于commit伪版本
      • 关键字:indirect
      • 依赖图
    • 依赖分发 【去哪里下载依赖
      • Github, SVN,不稳定
      • Proxy ,缓存,稳定可靠
      • 变量GOPROXY
    • 工具
      • -go get
        • go get example.org/pkg
      • -go mod
        • init:初始化,创建go.mod文件
        • download:下载模块到本地缓存
        • tidy:增加需要的依赖,删除不需要的依赖

通过本次课程的学习,我对go语言有了更加深入的理解,在之后的实践中也会根据所学内容进行项目管理。