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)会在运行时逃逸到堆中?