英文:
Golang closure access variables outside of closure
问题
在使用闭包的以下代码中,变量m和n是在堆栈上还是在堆上?
func main() {
var m, n int
add := func() int {
return m + n
}
fmt.Println(add())
}
在这段代码中,变量m和n都是在堆栈上分配的。闭包函数add
引用了外部函数main
中的变量m和n,但它们仍然是在堆栈上分配的。
英文:
In the following code which uses closure, variable m and n are on stack or heap?
func main() {
var m, n int
add := func() int {
return m + n
}
fmt.Println(add())
}
答案1
得分: 1
你可以使用以下标志构建你的代码:
go build -gcflags="-m"
然后查看实际发生的情况。在这个特定的案例中,对于整个文件:
package main
import "fmt"
func main() {
var m, n int
add := func() int {
return m + n
}
fmt.Println(add())
}
输出如下(go版本 go1.18 darwin/arm64):
./main.go:8:9: 可以内联 main.func1
./main.go:12:17: 内联调用 main.func1
./main.go:12:13: 内联调用 fmt.Println
./main.go:8:9: 函数字面量不逃逸
./main.go:12:13: ... 参数不逃逸
./main.go:12:17: ~R0 逃逸到堆上
所以 m 和 n 不会逃逸到堆上,但调用 add
的结果会逃逸。
英文:
You can build your code with following flags:
go build -gcflags="-m"
and see what is actually happening. In this particular case for the whole file:
package main
import "fmt"
func main() {
var m, n int
add := func() int {
return m + n
}
fmt.Println(add())
}
the output is as follows (go version go1.18 darwin/arm64):
./main.go:8:9: can inline main.func1
./main.go:12:17: inlining call to main.func1
./main.go:12:13: inlining call to fmt.Println
./main.go:8:9: func literal does not escape
./main.go:12:13: ... argument does not escape
./main.go:12:17: ~R0 escapes to heap
So m and n don't escape to heap, but the result of calling add
does escape.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论