funcFibonacci()func()int { a, b := 0, 1 returnfunc()int { a, b = b, a+b return a } }
funcmain() { f := Fibonacci()
for i := 0; i < 10; i++ { fmt.Printf("Fibonacci: %d\n", f()) } }
结果分析
1 2 3 4 5 6 7 8
# Fibonacci()函数中原本属于局部变量的a和b由于闭包的引用,不得不将二者放到堆上,以致产生逃逸。 $ go run -gcflags "-m -l" demo.go # command-line-arguments .\demo.go:6:2: moved to heap: a .\demo.go:6:5: moved to heap: b .\demo.go:7:9: func literal escapes to heap .\demo.go:17:13: ... argument does not escape .\demo.go:17:34: f() escapes to heap