实践测试
回归测试
集成测试
单元测试
从上到下,覆盖率增大,成本降低
单元测试规则
命名
func TestXxx(t * Test.T)
逻辑单元放在Testmain中
快速mock函数
为函数打桩
为方法打桩
gin框架实现基本逻辑
func main() {
if err :=init(filepath:"./data/"); err !=nil{
os.Exit(-1)
}
r:=gin.default()
r.GET(relative path, func(c, *gin.Context){
topicId=c.param(id)
data:=controller.QueryPageInfo(topicId)
c.json(200, data)
})
err:=r.run
if err!=nil{
return
}
}
高质量编程与编程规范
gofmt自动格式化代码
缩略词需要全部大写,但当其处于开头位置且不用提取出来则不必大写
变量距离最初使用距离越远,所需要的上下文信息也越多
recover只能用于defer中
defer是后进先出
string builder比buffer快
builer:转字符春采用拼接方法
buffer:转字符串采用重新内存分配
使用空结构体节省内存
实现set
使用atomic包
靠硬件实现,效率上由于操作系统实现的锁
优化准则
不要过度优化
不要过早优化
pprof工具
flat:函数本身所长cpu
cum:函数及其调用所占cpu
web下可视化
heap可以改为goroutine
alloc_objects: 程序累计申请
alloc_space:
inuse_objects: 程序当前
inuse_space:
采样原理
堆内存:记录分配器释放与分配大小、采样率:每512K记录一次,计算当时inuse=alloc-free
block: 阻塞超过一定阈值才被记录
分析基础库核心逻辑与性能瓶颈
数据按需索取
数据序列化协议的优化
Go语言优化
数据驱动优化
mutator:业务线程,分配新对象,修改对象指向
吞吐率:1-GC时间/程序总时间
编译优化思路:用编译时间换取高效的机器码
逃逸分析
指针经过传参被带到别的作用域可调用
内联函数
扩展了作用阈边界