golang逃逸技术分析

申请到栈内存好处:函数返回直接释放,不会引起垃圾回收,对性能没有影响。

申请到堆上面的内存才会引起垃圾回收。

1
2
3
4
5
6
7
func F() {
a := make([]int, 0, 20)
b := make([]int, 0, 20000)

l := 20
c := make([]int, 0, l)
}

a和b代码一样,就是申请的空间不一样大,但是它们两个的命运是截然相反的。a前面已经介绍过,会申请到栈上面,而b,由于申请的内存较大,编译器会把这种申请内存较大的变量转移到堆上面。即使是临时变量,申请过大也会在堆上面申请。

而c,对我们而言其含义和a是一致的,但是编译器对于这种不定长度的申请方式,也会在堆上面申请,即使申请的长度很短。

不同写法的性能差异


达到相同目的,可以有多种写法,每种写法有性能、可读性方面的区别,本文旨在探讨不同写法之间的性能差异

如何写单元测试基准测试(即性能测试),可参考 :

Go map转json

在Go中如何返回前端 字段名称/数量都不确定的json数据?


之前用Go写web服务,返回给前端的json格式的接口,有哪些要返回的字段都是明确的。都是预先定义一个结构体,json.Marshal一下即可~