这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天
语言进阶
- 协程是运行在用户态的,在线程内,更加轻量级。
- GO提倡通过通信共享内存实现,但也保留着通过共享内存通信。
-
Channel 分为有缓冲通道和无缓冲通道。
// chan1 无缓冲通道 chan1 := make(chan int) // chan2 有缓冲通道(4个缓冲单元) chan2 := make(chan int, 4) -
使用协程时一般搭配
WaitGroup使用
依赖管理
- GOPATH : 项目代码直接依赖 src 中的代码,不能实现 package 的多版本控制
- Go Vendor : 项目目录中 vendor 文件夹内保存依赖包副本,解决了不同项目依赖同一包不同版本的问题,但是不能解决同一项目依赖同一包不同版本的问题。
- Go Module : 通过 go.mod 文件管理依赖包版本。
- 指定依赖包版本时,既可以使用语义化版本,也可以使用基于commit伪版本。
- indirect : 间接依赖
- 若项目同时依赖A包的 V1.3 和 V1.4,编译时会选用最低的兼容版本,即 V1.4
项目测试
- 单元测试
- 测试文件以
_test.go结尾 - 测试函数格式为
func TestXxx(*testing. T) - 测试前初始化逻辑和测试后收尾工作在
TestMain中执行 - 善用
assert
- 测试文件以
- Mock
- 使用桩函数代替一些函数,防止依赖文件的改变导致测试结果出错
- 基准测试
- math/rand 包中的 rand 函数为了保证全局随机性和并发安全,在调用时会上锁,会影响并发的性能。
- bytedance 开源了 fastrand 包,在并行时性能很好,但牺牲了全局随机性。
项目实践
- Topic结构体
type Topic struct {
Id int64 `json:"id"`
Title string `json:"title"`
Content string `json:"content"`
CreateTime time.Time `json:"create_time"`
}
- Post结构体
type Post struct {
Id int64 `json:"id"`
TopicId int64 `json:"topic_id"`
Content string `json:"content"`
CreateTime time.Time `json:"create_time"`
}
本项目将 Topic 和 Post 数据读取到了内存中,然后使用 map 初始化全局内存索引,实现快速查找。
- 在获取数据时,可以考虑能否并行处理。