Day 2 Go 语言进阶与依赖管理
一、语言进阶
1、并发与并行
并发:多线程程序在单核cpu上运行
并行:多线程程序在多核cpu上运行
2、协程与线程
协程:用户态,轻量级线程,栈KB级别
线程:内核态,线程跑多个协程(go语言一次可以跑上万个),栈MB级别
开启多个协程:在调用函数前加入go关键字
3、协程通信
①通过通信channel共享内存,传输队列能保证收发数据的顺序(提倡)
②通过共享内存实现通信,需要获取临界区的权限,不同的Gorountine间容易发生数据竞态的问题
channel:无缓冲通道,同步通道;有缓冲通道,通道容量,可以解决生产和消费速度不均衡带来的执行效率问题
make(chan int) #无缓冲通道
make(chan int,2) #有缓冲通道(2)
4、并发安全Lock
临界区加锁和不加锁:不加锁会出现未知的结果,加锁通过对临界区的权限控制来保证并发安全,并发安全有概率引起数据错误(应避免共享内存非并发安全的读写操作)
5、waitgroup(实现并发同步)
①Add(delta int)
②Done() 执行结束 -1
③wait() 阻塞
二、依赖管理
1、gopath-弊端:无法实现package的多版本控制(版本冲突)
2、Go Vendor:每个项目引入一份依赖副本,弊端:不能清晰表示依赖版本的概念(又会出现版本冲突)
3、Go Module:定义版本规则和管理项目依赖关系
4、依赖管理:go.mod + Proxy + go get/mod
①依赖配置go.mod:选择最低的兼容版本
②依赖分发-Proxy:稳定可靠的依赖分发
③工具:go get/mod
感悟:代码的高复用性是优秀代码必备的品质,而Go语言的包管理就为我们封装模块和复用代码提供了强有力的支撑