type A struct {
x1 []int
x2 []string
}
func (this *A) Test() {
fmt.Printf("this is: %p, %+v\n", this, *this)
}
func main() {
var fn func()
{
a := &A{}
a.x1 = []int{1, 2, 3}
a.x2 = []string{"one", "two", "three"}
fn = a.Test
}
fn()
}
请参阅:https://play.golang.org/p/YiwHG0b1hW-
我的问题是:
答案 0 :(得分:4)
Go是一种垃圾收集语言。只要您不触摸包unsafe
(或包reflect
中的Value.UnsafeAddr()
之类的东西),所有值只要可访问就保留在内存中。您不必担心内存管理。
这就是为什么返回在函数内部创建的局部变量的地址(指针)也是安全的。同样安全的是,从函数值(闭包)中引用局部变量,这些函数变量将在将来某个时间执行该函数值时超出范围,例如:
func counter() func() int {
i := 0
return func() int {
i++
return i
}
}
此counter()
返回一个函数(关闭),该函数在被调用时返回递增的值:
c := counter()
fmt.Println(c())
fmt.Println(c())
fmt.Println(c())
这将输出(在Go Playground上尝试):
1
2
3
counter()
创建一个局部变量i
,该局部变量不返回但可以从其返回的函数值中进行访问。只要可访问返回的函数值,就不会释放局部变量i
。同样,如果您再次调用counter()
,则会创建一个与上一个变量不同的新i
变量。
查看相关问题: