func main() {
i1 := 1
A1(&i1)
}
func A1(i1 *int) *int {
return i1
}
而逃逸分析的结果是
./main.go:18:9: parameter i1 leaks to \~r1 with derefs=0:
./main.go:18:9: flow: \~r1 = i1:
./main.go:18:9: from return i1 (return) at ./main.go:19:2
./main.go:18:9: leaking param: i1 to result \~r1 level=0
parameter i1 leaks to \~r1 with derefs=0和是什么意思leaking param: i1 to result \~r1 level=0
首先我尝试谷歌golang escape leaking,最相关的结果是在escape-analysis-shows-channel-as-leaking-param的评论中
“你为什么那么想?” 可以合理地假设泄漏是坏的并且与其阀杆泄漏有关。我正在努力想出一个泄漏是一件好事的示例上下文,例如泄漏桶、泄漏油箱、泄漏、泄漏电容器、泄漏船、泄漏抽象。对于高性能 go 专家来说这可能是显而易见的,但对于我们其他人来说,链接到文档并简要说明泄漏参数指的是什么会很有帮助
和我想问的是同一个问题,但是之后就没有回复了。
然后我尝试阅读打印这些结果的源代码。
在compile/internal/escape/leaks.go中,我找到了评论
// 泄漏表示来自参数的一组赋值流
// 到堆或它的任何函数(第一个 numEscResults)
// 结果参数。
但我无法理解这一点,是否有任何官方文件来表示它。
此外,在源代码中我发现了一个问题。如果之后的结果参数numEscResults(7)会在运行时逃逸到堆中?