GO语言工程实践之测试 | 青训营笔记

82 阅读2分钟

这是我参与「第五届青训营 」伴学笔记创作活动的第 1 天

语言进阶

  • 协程是运行在用户态的,在线程内,更加轻量级。
  • GO提倡通过通信共享内存实现,但也保留着通过共享内存通信。

image-20230117011508254

  • 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 初始化全局内存索引,实现快速查找。

  • 在获取数据时,可以考虑能否并行处理。