这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
重点内容
- 语言进阶 从并发编程的视角了解Go高性能的本质
- 依赖管理 了解依赖管理的演进路线
- 测试
- 项目实战 通过项目需求、需求拆解、逻辑设计、代码实现感受真实开发
详细知识点
并发和并行
**并发: **多线程程序在单核cpu上运行 **并行: **多线程程序在多核cpu上运行
Goroutine
**协程: **用户态,轻量级线程,栈KB级别 **线程: **内核态,线程跑多个协程,栈MB级别 go能跑上万个协程
创建协程:在函数前加 go 关键字
CSP(协程间通信)
提倡通过通信共享内存而不是通过共享内存实现通信 前者需要通道,后者需要获取临界区权限,容易发生数据静态,影响性能
Channel
创建方式:make(chan 元素类型,[缓冲大小])
make(chan int) //无缓冲通道
make(chan int,2) //有缓冲通道
无缓冲:发送的Gorountine和接受的Gorountine同步化,也被称为同步通道
有缓冲:可以解决同步问题,通道中缓冲满了发送方无法再发送,直到缓冲有空间
func CalSquare(){
src := make(chan )
}
并发安全Lock
不加锁可能导致不同进程操作同一块内存,通过Sync完成
依赖管理
三要素:
- 配置文件,描述依赖 go.mod (类似于CMAKE、makefile?)
- 中心仓库管理依赖库 Proxy
- 本地工具 go get/mod
go.mod
Proxy
优点:稳定可靠
GOPROXY=”proxy1.cn,https://proxy2.cn,…“ ”“内为服务站点url列表,direct表示源站 按顺序
go get/mod
命令go get example.org/pkg
- @update 默认添加
- @none 删除依赖
- @v1.1.2 tag版本,语义版本
- @23dfdd5 特定的commit
- @master 分支最新的commit
GOPATH(不重要)
·环境变量 $GOPATH ·项目代码直接依赖src ·go get 下载最新版本的包到src目录下
若A、B两个项目依赖于某一pkg的不同版本:无法实现pkg的多版本控制
Go Vendor
Go Module
· 通过go.mod文件管理依赖包版本 · 通过go get/go mod指令工具管理依赖包