``` go
var g *int
go func() {
var f int
f=10
g=&f
}()
time.Sleep(100*time.Millisecond)
fmt.Println(g)
fmt.Println(*g)
```
<br/>
按理来说,这个goroutine运行完之后,f 这个变量会被销毁,那么 g 指向的内存所存储的数据将会变成未知数据,因为这块内存已经被OS回收,说不定已被分配给其它变量。<br/>
但是现在并没有出现这个问题,难道说不能用c++的思想去思考这个问题,难道是go的GC帮我保留了这块内存?因为它知道我还要使用它?
更多评论
建议看下 the Go programming language 2.3.4 这里举得例子都和你这个差不多。
“A compiler may choose to allocate local variables on the heap or on the stack but, perhaps surprisingly, this choice is not deter mined by whether var or new was used to declare the variable” 这里的f肯定是分配在heap上的,goroutine运行完之后发现还有global的变量引用,就不会销毁的。
#1
楼上说得对. C++中分配在栈上的内存当然不能这样写, 但是 go compiler 会分析你分配在栈上的方式是不是合适的, 如果不合适它会帮你分配到堆上.
#2