请检查代码
package main
import (
"fmt"
"reflect"
)
func main() {
factory := func (name string) func(){
return func (){
fmt.Println(name)
}
}
f1 := factory("f1")
f2 := factory("f2")
pf1 := reflect.ValueOf(f1)
pf2 := reflect.ValueOf(f2)
fmt.Println(pf1.Pointer(), pf2.Pointer())
fmt.Println(pf1.Pointer() == pf2.Pointer())
f1()
f2()
}
结果:
4199328 4199328
true
f1
f2
为什么会到达闭包函数的同一个地址!
或者如何获得唯一的地址!
函数指针表示函数的代码。并且通过函数字面量创建的匿名函数的代码仅在内存中存储一次,无论返回匿名函数值的代码运行多少次。这意味着所有函数值(或更准确地说是函数指针)都将相同。
所以你无法区分存储在的值f1
and f2
:它们表示调用时要执行的相同代码块。
由存储在您的函数值返回的函数值factory
变量是一个闭包。只要可访问,它所引用的环境(局部变量和函数参数)就会一直存在。在你的情况下,这意味着因为函数值f1
and f2
参考name
封闭匿名函数的参数,只要函数值(在f1
and f2
)是可以访问的。这是唯一使它们“不同”或独特的东西,但这从“外部”是看不见的。
您可以继续打印以下地址吗name
在闭包中,您会看到它们是闭包的多个值的不同变量,but它是same if the same闭包(函数值)被再次调用。首先修改闭包以打印地址name
:
factory := func(name string) func() {
return func() {
fmt.Println(name, &name)
}
}
并打电话f1
and f2
多次:
f1()
f2()
f1()
f2()
Output:
f1 0x1040a120
f2 0x1040a130
f1 0x1040a120
f2 0x1040a130
如您所见,name
参数被保留并且相同name
如果再次调用相同的闭包,则再次使用参数。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)