首页 > 后端开发 > Golang > 正文

封闭所容纳的环境范围是什么?

WBOY
发布: 2024-02-10 11:12:09
转载
1131人浏览过

封闭所容纳的环境范围是什么?

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 中,闭包获取对其关闭的任何变量(的地址)的引用。引用语言参考

函数文字是闭包:它们可以引用周围函数中定义的变量。然后,这些变量在周围的函数和函数文字之间共享,并且只要可访问,它们就会一直存在。

FaceSwapper
FaceSwapper

FaceSwapper是一款AI在线换脸工具,可以让用户在照片和视频中无缝交换面孔。

FaceSwapper 729
查看详情 FaceSwapper

因此,在您的示例中:

  1. f1 := foo1()

    1. 使 xValue 变量存在(编译器可能会在堆上分配它)。它将以其类型的零值 0 开始。
    2. 使变量 x 存在并为其分配 xValue 的地址。
    3. defer-red 闭包运行并将值 2 分配给 xValue
    4. 返回一个关闭变量 x 的闭包。

    后一点可能有点棘手:由于返回的闭包引用了变量 x,编译器保证即使在 foo 返回后该变量也存在。由于 x 包含 xValue 的地址(因此是对它的实时引用),因此该地址仍然存在,并且不能被垃圾收集。 使用相同的转义分析方法,编译器保证 xValue 在其声明的函数返回后仍然存在。

  2. 您执行返回的闭包,该闭包通过指向它的指针修改 xValue – 这里没有发生任何魔法。另外两个调用执行相同的操作。

总而言之,也许您被 C++ 知识绊倒了,一旦从该函数返回控制权,函数中声明的任何变量都将不再存在,因此该函数外部存在的对该变量的任何引用都将变为无效的。在 Go 中,情况并非如此:在这方面,该语言被显式定义为安全:编译器确保任何变量都有适当的分配,以便在返回(或以其他方式传达)对它的引用时在创建它的函数调用中生存下来。从该函数调用到外部世界。

以上就是封闭所容纳的环境范围是什么?的详细内容,更多请关注php中文网其它相关文章!

相关标签:
最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号