特别是当变量在本地作用域内生成时。它的存活时间有多长?
例如,给定一个循环创建 10 只狗,并将指针传递到一个通道中,例如
for i := 0; i < 10; i++ {
dogAddr := produce(i) // assume we already have: func produce(i int) *Dog
c <- dogAddr // c: channel
}
当循环结束时,狗会立即被释放吗?它们会只存活一段神奇的时间等待被消耗,它们会在被消耗后被释放吗?
我在一个简单的代码中对此进行了测试,结果似乎表明局部变量将永远存在。
package main
import (
"fmt"
"time"
)
func main() {
var a int
var c chan *int = make(chan *int, 1000)
var m map[int]*int = make(map[int]*int)
for i := 0; i < 10; i++ { // this is generation-loop
x := i
m[i] = &x
fmt.Println(i, "mapping to: ", &a)
c <- &x
} // the generation-loop breaks here
for i := 0; i < 10; i++ {
fmt.Println(i, "stored pointer: ", m[i]) // we can still call the variables
}
for i := 0; i < 10; i++ {
fmt.Println(i, "stored value: ", *m[i]) // we can still call the variables
p := <-c
fmt.Println(i, "channel value: ", *p) // we can still call the variables
}
time.Sleep(20 * time.Second)
}
我对为什么会发生这种情况感到非常困惑。只要局部块完成,局部变量就不会失去其寿命吗?如果我使用的方式是错误的,那么在Go中将局部变量传递给外部用户的正确方法是什么?
holdtom
相关分类