函数指针表示函数的代码。由函数文字创建的匿名函数的代码仅在内存中存储一次,无论返回匿名函数值的代码运行了多少次。这意味着所有函数值(或更确切地说,函数指针)将相同。
因此,您无法区分存储在
f1和中的值
f2:它们表示调用它们时要执行的同一代码块。
由存储在
factory变量中的函数值返回的函数值是一个闭包。只要可访问,它所引用的环境(局部变量和函数参数)就可以保留。在您的情况下,这意味着由于in中的函数值
f1并
f2引用
name了封闭的匿名函数的参数,因此只要可访问函数值(in
f1和
f2),就将保留它们(“ they”(来自多个调用))。这是使它们“不同”或唯一的唯一原因,但从“外部”看不到。
您会继续打印并
name在闭包中打印地址吗,您会发现它们对于闭包的多个值而言是不同的变量, 但是 如果再次调用 相同的
闭包(函数值),则它们是 相同 的。首先修改闭包以同时打印以下地址: __
name
factory := func(name string) func() { return func() { fmt.Println(name, &name) }}并调用
f1和
f2多次:
f1()f2()f1()f2()
输出:
f1 0x1040a120f2 0x1040a130f1 0x1040a120f2 0x1040a130
如您所见,如果再次调用相同的闭包,
name则保留该
name参数,并再次使用相同的参数。



