zqiz 发表于 2024-10-28 10:51:19

延迟执行()与原生go语言的defer在循环中结果不一样?

延迟执行()与原生go语言的defer在循环中结果不一样?

飞拓联创 发表于 2024-10-28 11:01:14

敢不敢把代码放线中间去

zqiz 发表于 2024-10-28 11:08:38

飞拓联创 发表于 2024-10-28 11:01
敢不敢把代码放线中间去

是这样吗,结果依然是

沉默流星 发表于 2024-10-28 11:31:38

zqiz 发表于 2024-10-28 11:08
是这样吗,结果依然是

方式对,要放在循环体里面把 换行格式输出 ,而不是放在延迟执行方法的方法体内


原因也很简单
原生你这样写就明白了// 原生代码
        for i := 0; i < 5; i++ {
                defer func() {

                }()

                fmt.Println(i)

        }

沉默流星 发表于 2024-10-28 11:33:17

zqiz 发表于 2024-10-28 11:08
是这样吗,结果依然是

建议你购买一套我的服务器封装视频教程,系统学习一下。才29.9元.当然不买也是可以的,只是个建议哈

zqiz 发表于 2024-10-28 11:35:54

沉默流星 发表于 2024-10-28 11:31
方式对,要放在循环体里面把 换行格式输出 ,而不是放在延迟执行方法的方法体内




那是书的源码,我想知道:原生与中文写法一样,为什么结果不一样呢

沉默流星 发表于 2024-10-28 11:38:56

zqiz 发表于 2024-10-28 11:35
那是书的源码,我想知道:原生与中文写法一样,为什么结果不一样呢

很简单,你打开火山封装的延迟执行方法,看下封装的源码就明白了

zqiz 发表于 2024-10-28 11:43:50

沉默流星 发表于 2024-10-28 11:33
建议你购买一套我的服务器封装视频教程,系统学习一下。才29.9元.当然不买也是可以的,只是个建议哈 ...

可以

沉默流星 发表于 2024-10-28 11:47:09

zqiz 发表于 2024-10-28 11:43
可以



Xelloss0618 发表于 2024-10-28 15:40:09

zqiz 发表于 2024-10-28 11:35
那是书的源码,我想知道:原生与中文写法一样,为什么结果不一样呢

不一样,你的原生代码是直接推迟执行 Println 函数,defer会将参数值拷贝下来。

火山里会将子语句体封装成一个无参数的匿名函数,没有参数,自然也没有拷贝参数值。
所以匿名函数里引用的是变量本身,输出的都是变量的最后值 5。

for i := 0; i < 5; i++ {
    defer func () { fmt.Println(i) } ()
}

如果给匿名函数加个参数,就可以输出 4 3 2 1 0

for i := 0; i < 5; i++ {
    defer func (n int) { fmt.Println(n) } (i)
}
页: [1] 2
查看完整版本: 延迟执行()与原生go语言的defer在循环中结果不一样?