day2笔记 | 青训营

82 阅读2分钟

实践测试

回归测试

集成测试

单元测试

从上到下,覆盖率增大,成本降低

单元测试规则

命名

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时间/程序总时间

编译优化思路:用编译时间换取高效的机器码

逃逸分析

指针经过传参被带到别的作用域可调用

内联函数

扩展了作用阈边界