这是我参与「第五届青训营 」笔记创作活动的第1天。
Goroutine
- 并发与并行
- 并发是看似同时;并行才真的是同时。
- 线程与协程
- 协程是用户态的轻量级线程,栈 MB 级别。
- 一个线程可以并发运行多个协程。
- CSP(communication sequential process)
- 通过 channel 通信而不是共享内存
- 共享内存会引入 critical section。会降低性能。
- Go 也有
sync包来帮助共享内存方式的并发控制-
基础的互斥锁
import "sync" var lock sync.Mutex lock.Lock() // critical section lock.Unlock() -
任务控制
阻塞主线程
import "sync" var wg sync.WaitGroup wg.Add(delta) wg.Done() wg.Wait()
-
- Go 也有
- channel
- 无缓冲 (e.g.
make(chan int)) - 有缓冲 (e.g.
make(chan int, N))
- 无缓冲 (e.g.
依赖管理
版本控制
演进
- GOPATH
- 一个环境变量指定的工作区。
- 目录
bin二进制文件pkg中间产物src我的项目和我依赖的项目
- 缺点
- 无法实现 package 的多版本控制。因为
src目录下面只能放一个版本的依赖。
- 无法实现 package 的多版本控制。因为
- Go Vendor
- 我的项目目录下面放依赖的备份/副本。从而每个项目都有自己所需要的依赖版本。
- 缺点
- 菱形依赖问题
- Go Module
- 配置文件
.mod- 可以看
Russ Cox的博客。
- 可以看
- proxy
- 客户端工具
- 配置文件
测试
单元测试
单元,如函数、模块。给定输入,判断输出和预期是否一致。
- 规则
- 所有的测试文件以
_test.go结尾。 func TestXxx(* testing.T)- 初始化逻辑放到
TestMain中func TestMain(m * testing.M)
- 所有的测试文件以
- 评估
-
单元测试-覆盖率
go test XXX --cover
-
Mock
函数替换;避免依赖资源篡改。
基准测试
分析系统性能
BenchmarkXxx
项目开发流程
【话题-帖子】后端处理
视图层(和外部交互)-逻辑层(业务逻辑)-数据层(增删改查)
数据层
topic
{
"id"
"title"
"content"
"create_time"
}
post
{
"id"
"parent_id"
"content"
"create_time"
}
var {
topicIndexMap map[int64] * Topic
postIndexMap map[int64] []*Post
}
逻辑层
type PageInfo struct {
Topic * repo.Topic
PostList []*repo.Post
}
视图层
type PageData {
Code int64
Msg string
Data interface{}
}