登录
首页 >  Golang >  Go问答

Golang 闭包访问闭包之外的变量

来源:stackoverflow

时间:2024-04-09 09:18:32 344浏览 收藏

Golang不知道大家是否熟悉?今天我将给大家介绍《Golang 闭包访问闭包之外的变量》,这篇文章主要会讲到等等知识点,如果你在看完本篇文章后,有更好的建议或者发现哪里有问题,希望大家都能积极评论指出,谢谢!希望我们能一起加油进步!

问题内容

在下面使用闭包的代码中,变量 m 和 n 是在栈上还是堆上?

func main() {
    var m, n int

    add := func() int {
        return m + n
    }

    fmt.Println(add())
}

正确答案


您可以使用以下标志构建代码:

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: 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

所以 m 和 n 不会逃逸到堆,但是调用 add 的结果确实会逃逸。

今天关于《Golang 闭包访问闭包之外的变量》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>