golang闭包问题

发布于 2022-09-07 19:48:04 字数 414 浏览 15 评论 0

有函数如下
package main

import "fmt"

func intSeq() func() int{

i := 0
return func() int {
    i += 1
    return i
}

}
func main(){

nextInt := intSeq()
fmt.Println(nextInt())
fmt.Println(nextInt())
fmt.Println(nextInt())

newInts := intSeq()
fmt.Println(newInts())

}

在intSeq()中,匿名函数里的i和外部环境中的i是同一个吗?还是说外部的i是在栈中,匿名函数的i是在堆中?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

大海や 2022-09-14 19:48:04

可以进行一下内存逃逸分析, 执行一下

go run -gcflags '-m -l' demo.go

可以看到输出结果如下:


# command-line-arguments
./demo1.go:7:9: func literal escapes to heap
./demo1.go:7:9: func literal escapes to heap
./demo1.go:8:3: &i escapes to heap
./demo1.go:6:2: moved to heap: i
./demo1.go:15:21: nextInt() escapes to heap
./demo1.go:16:21: nextInt() escapes to heap
./demo1.go:17:21: nextInt() escapes to heap
./demo1.go:20:21: newInts() escapes to heap
./demo1.go:15:13: main ... argument does not escape
./demo1.go:16:13: main ... argument does not escape
./demo1.go:17:13: main ... argument does not escape
./demo1.go:20:13: main ... argument does not escape
1
2
3
1

可以看到&i,i和nextInt函数都从栈空间逃逸到了堆上. &i就是nextInt函数中的那个i.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文