php小编鱼仔封闭所容纳的环境范围是指封闭环境中所包含的元素、因素和条件。封闭环境是指一个相对封闭、受限制的空间或范围,可以是物理空间,如实验室、工厂车间, 也可以是虚拟空间,如计算机网络。在封闭环境中,各种因素如温度、湿度、气体组成等都可以被控制和调节,以达到特定的目的。封闭环境常见于科研实验、生产制造等领域,对于保证实验精确性、产品质量等方面起到重要作用。
我模仿网上关于闭包的教程,写了下面的代码。
func foo1() func() { xvalue := 1 x := &xvalue defer func() { xvalue = 2 }() return func() { *x = *x + 1 fmt.printf("foo1 val = %d\n", *x) } } func main() { f1 := foo1() f1() f1() f1() }
我很困惑,在执行 f1 := foo1()
后,变量 xvalue
似乎应该被回收,因此使用 *x
应该是错误的,但上面的代码没有错误并且执行罚款,给出输出
foo1 val = 3 foo1 val = 4 foo1 val = 5
所以我想知道闭包除了保存指针本身之外还保存了指针的值还是go语言的垃圾回收机制导致xvalue没有被删除?
在 Go 中,闭包获取对其关闭的任何变量(的地址)的引用。引用语言参考:
函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文字之间共享,并且只要可访问,它们就会一直存在。
因此,在您的示例中:
f1 := foo1()
xValue
变量存在(编译器可能会在堆上分配它)。它将以其类型的零值 0 开始。x
存在并为其分配 xValue
存在并为其分配 defer
-red 闭包运行并将值 2 分配给 xValue
defer
-red 闭包运行并将值 2 分配给 x
返回一个关闭变量
x
,编译器保证即使在 foo
返回后该变量也存在。由于 x
包含 xValue
后一点可能有点棘手:由于返回的闭包引用了变量 xValue
,编译器保证即使在 foo
返回后该变量也存在。由于
xValue
🎜 🎜总而言之,也许您被 C++ 知识绊倒了,一旦从该函数返回控制权,函数中声明的任何变量都将不再存在,因此该函数外部存在的对该变量的任何引用都将变为无效的。在 Go 中,情况并非如此:在这方面,该语言被显式定义为安全:编译器确保任何变量都有适当的分配,以便在返回(或以其他方式传达)对它的引用时在创建它的函数调用中生存下来。从该函数调用到外部世界。🎜
以上是封闭所容纳的环境范围是什么?的详细内容。更多信息请关注PHP中文网其他相关文章!