go1.21循环中的变量有变化

最近发了go1.21.0, 听说循环中的变量有变化,跑一下看看。
1.21.0默认还是和之前一样的。通过设置 go env -w GOEXPERIMENT=loopvar 让新语义生效

package main

import (
	"fmt"
	"sync/atomic"
	"time"
)

func main() {
	var is []int32
	for i := int32(0); i < 10; i++ {
		is = append(is, i)
	}

	var kk atomic.Int32
	c := int32(0)
	for _, i2 := range is {
		c += i2
		go func() {
			time.Sleep(time.Millisecond * 50)
			kk.Add(i2)  // goland提醒:Loop variables captured by 'func' literals in 'go' statements might have unexpected values 
		}()
	}
	// 就不用WaitGroup了
	time.Sleep(time.Second * 3)
	fmt.Println(kk.Load(), c)  // 不启用GOEXPERIMENT=loopvar打印90,45 ,否则打印45,45
}
posted @   xiaotushaoxia  阅读(148)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示