Go语言进阶 | 青训营

71 阅读2分钟

 

1并发VS并行 

发:多线程程序在一个核的cpu上运行(在一段时间内同时发生 

行:多线程程序在多个核的cpu上运行(在同一时刻内同时发生 Go可以充分发挥多核优势,高效运行 

 1.1Goroutine 

协程:用户态,轻量级线程,栈KB级别(Go语言可以一次性创造上万个协程,高效运行原因之一) 

 调用协程:调用函数的时候加上go关键字即可 

 线程:内核态,线程跑多个协程,栈MB级别 1.2CSP(communicating Sequential Processes) 

协程之间的通信: 通过通信共享内存 通过共享内存实现通信 提倡通过通信共享内存而不是通过共享内存而实现通信 

 1.3channel 

是引用类型 使用make关键字来构造 

语法:make(chan 元素类型, [缓冲大小]) //缓冲大小表示通道中能存放多少元素 

无缓冲大小:make(chan int) //会使发送Goroutine和接收Goroutine同步 也叫同步通道 

有缓冲大小:make(chan int,2) 

1.4并发安全Lock

1.5WaitGroup

2依赖管理

背景:

  • 工程项目不可能基于标准库0~1编码搭建
  • 管理依赖库

2.1Go依赖管理演进

GOPATH -> Go Vendor -> Go Module

  • 不同环境(项目)依赖的版本不同
  • 控制依赖库的版本

2.1.1GOPATH

GOPATH是Go语言支持的一个环境变量,value是Go项目的工作区。

目录有以下结构:src(存放Go项目的源码);pkg(存放编译的中间产物,加速编译);bin(存放Go项目编译生成的二进制文件

  • 环境变量$GOPATH
  • 项目代理直接依赖src下的代码
  • go get下载最新版本的包到src目录下

GOPATH的弊端:在GOPATH管理模式下,如果多个项目依赖同一个库,则依赖该库是同一份代码,所以不同项目不能依赖同一个库的不同版本,这显然不能满足我们项目的需求。(无法实现package的多版本控制)

2.1.2Go Vendor

  • 项目目录下增加vendor文件,所有依赖包副本形式在$ProjectRoot/vendor
  • 依赖寻址方式:vendor => GOPATH

通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题

Go Vendor的弊端:

  • 无法控制依赖的版本
  • 更新项目又可能出现以来冲突,导致编译出错

2.1.3Go Module

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

终极目标:定义版本规则和管理项目依赖关系

2.2依赖管理三要素

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

如果你熟悉Java,可以类比一下Maven

2.3.1依赖配置-go.mod

2.3.2依赖配置-version

  • 语义化版本
  • 基于commit伪版本

2.3.3依赖配置-indirect

2.3.4依赖配置-incompatible

  • 主版本2+模块会在模块路径增加/vN后缀
  • 对于没有go.mod文件并且主版本2+的依赖,会+incompatible