这是我参与「第五届青训营 」伴学笔记创作活动的第 2 天
一、目录
本节课主要分为四个部分:
1.并发编程
2.依赖管理
3.单元测试
4.项目实战
二、并发编程
1.协程Goroutine
协程与线程的区别:线程为用户态,轻量级线程,栈MB级别;协程为内核态,线程跑多个协程,栈KB级别。
使用go func开启一个协程。
2.通道Channel
无缓冲通道:make(chan int)
有缓冲通道:make(chan int,2)
3.锁Lock
关于锁的操作
锁的定义:
var{
x int64
lock sync.Mutex
}
上锁:lock.Lock()
释放锁:lock.Unlock()
4.线程同步WaitGroup
关于WaitGroup的操作
计数器+delta:Add(delta int)
计数器-1:Done()
阻塞直到计数器为0:Wait()
三、依赖管理
1.Gopath
Gopath是go语言的环境变量,是go项目的工作区。
bin 项目编译的二进制文件
pkg 项目编译的中间产物,加速编译
src 项目源码
项目代码直接依赖src下的代码。
使用 go get 下载最新版本的包到src目录下。
弊端
无法实现package的多版本控制。
2.Go Vendor
通过每个项目引入一份依赖的副本,解决了多个项目需要同一个package依赖的冲突问题。
弊端
1.无法控制依赖的版本。
2.更新项目有可能出现依赖冲突,导致编译出错。
3.Go Module
通过 go.mod 文件管理依赖包版本。
通过 go get/go mod 指令工具管理依赖包。
go.mod
依赖标识:[Module Path] [Version/Pseudo-version]
version
语义化版本与基于commit伪版本。
indirect
用以标识没有直接导入的间接依赖模块。
incompatible
用以标识可能有兼容问题。(对于没有go.mod文件及主版本在v2及以上的依赖)
go get的使用
go get example.org/pkg
@update:默认。
@none:删除依赖。
@v1.1.2:tag版本,语义版本。
@23dfdd5:特定的commit。
@master:分支的最新commit。
go mod的使用
go mod
init:初始化,创建go.mod文件。
download:下载模块到本地缓存。
tidy:增加需要的依赖,删除不需要的依赖。
四、单元测试
测试分类:回归测试、集成测试、单元测试。
测试成本逐渐降低,覆盖率逐渐上升。
单元测试的覆盖率决定代码质量,一般覆盖率需要在50%-60%之间。
五、项目实战
可以先画E-R图帮助分析,本例中实体为话题和帖子,关系为一对多,相应设计出实体的属性。
然后按照分层结构来设计:数据层->逻辑层->视图层。
用的一些工具:
gin:go web框架。
go mod:实现依赖管理。