loopvar 改动不同版本的影响-defer,closures

defer示例代码

package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("golang version:", runtime.Version())
	defer_demo()
}

func defer_demo() {
	defer println()
	for counter, n := 0, 0; n < 3; n++ {
		defer func(v int) {
			fmt.Print(counter)
			counter++
		}(n)
	}
}

代码说明

这个代码先打印了使用的golang的版本,然后进行一个for循环,for循环中定义了一个defer func,打印出循环时定义的变量counter的值,在counter自增 go run xxx.go看下结果

golang 1.21的运行结果

go run demo/defer.go
golang version: go1.21.5
012

可以看到在1.21.5这个版本中,打印出来的counter值自增成功了,在1.22中又会如何呢

golang 1.22的运行结果

go run demo/defer.go     
golang version: go1.22.1
000

可以看到在1.22.1的这个版本中,打印出来的值都是一样的。

再举个例子

package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("golang version:", runtime.Version())
	defer_demo()
}

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


在1.21的版本中的结果:

go run demo/defer2.go
golang version: go1.21.5
3
3
3

可以看到ids这个slice中的值都是10

在1.22的版本中的结果

go run demo/defer2.go
golang version: go1.22.1
2
1
0

修改方法

第一个例子本意应该是让counter自增的,可以把counter的定义放在循环外面.修改后的代码

package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("golang version:", runtime.Version())
	defer_demo()
}

func defer_demo() {
	counter := 0
	defer println()
	for n := 0; n < 3; n++ {
		defer func(v int) {
			fmt.Print(counter)
			counter++
		}(n)
	}
}

1.21和1.22的执行结果

go run demo/defer.go 
golang version: go1.21.5
012

go run demo/defer.go
golang version: go1.22.1
012



针对第二个例子改动比较简单,把循环变量作为defer func的参数即可,修改后的代码

package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("golang version:", runtime.Version())
	defer_demo()
}

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

这样1.21和1.22的结果就都一样了

go run demo/defer2.go
golang version: go1.21.5
2
1
0


go run demo/defer2.go
golang version: go1.22.1
2
1
0

第二个例子如果把defer func换成一个closures也会出现1.21和1.22打印不一样的情况

代码

package main

import (
	"fmt"
	"runtime"
)

func main() {
	fmt.Println("golang version:", runtime.Version())
	defer_demo()
}

func defer_demo() {
	var demoFunc func()
	for i := 0; i < 3; i++ {
		if demoFunc == nil {
			demoFunc = func() {
				fmt.Println(i)
			}
		}
		demoFunc()
	}
}

运行结果

go run demo/closures.go
golang version: go1.21.5
0
1
2

go run demo/closures.go
golang version: go1.22.1
0
0
0

相关推荐

  1. loopvar 改动不同版本影响-并发

    2024-04-09 16:26:02       12 阅读
  2. loopvar 改动不同版本影响-基础循环

    2024-04-09 16:26:02       17 阅读
  3. loopvar 改动不同版本影响-defer,closures

    2024-04-09 16:26:02       14 阅读
  4. loopvar 改动不同版本影响-大循环执行时间

    2024-04-09 16:26:02       15 阅读
  5. HTTP不同版本区别

    2024-04-09 16:26:02       13 阅读
  6. 不同情绪调节策略影响拖延行为神经基础

    2024-04-09 16:26:02       20 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-04-09 16:26:02       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-04-09 16:26:02       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-04-09 16:26:02       18 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-04-09 16:26:02       20 阅读

热门阅读

  1. 李沐20_卷积层里的填充和步幅——自学笔记

    2024-04-09 16:26:02       13 阅读
  2. macOS MySQL环境配置

    2024-04-09 16:26:02       13 阅读
  3. C语言-翁恺-PTA-81-120课后练习题-03

    2024-04-09 16:26:02       14 阅读
  4. Docker Desktop+WSL2安装到自定义路径

    2024-04-09 16:26:02       14 阅读
  5. ST表(数据结构中的问题)

    2024-04-09 16:26:02       11 阅读
  6. C语言什么是外部函数?怎么⽤?

    2024-04-09 16:26:02       15 阅读
  7. Python - 基础知识

    2024-04-09 16:26:02       12 阅读
  8. 软件开发步骤

    2024-04-09 16:26:02       13 阅读
  9. vue组件上传图片的时候给图片加上水印

    2024-04-09 16:26:02       14 阅读
  10. @what is the thesis?----how to write a essay?

    2024-04-09 16:26:02       14 阅读