searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

go 1.22与之前版本关于for循环的注意点

2024-07-03 09:52:35
4
0

Go 1.22 给 for 循环带来了一些重要更新。主要有两点值得注意:

首先,循环变量不再共享了。这解决了一个老大难问题 - 在循环里启动 goroutine 时可能出现的诡异行为。以前,我们可能会遇到所有 goroutine 打印同一个值的情况,因为它们都引用了同一个变量。现在每次迭代都会创建新的变量实例,所以这个问题就不存在了。

举个例子:

values := []int{1, 2, 3}
  for i := range values {
      go func() {
          fmt.Println(i)
      }()
  }

在旧版本中,这段代码可能会打印出三个相同的数字。但在 Go 1.22 中,它会如我们所期望的那样,打印出 1、2、3(虽然顺序可能是随机的)。

其次,Go 1.22 简化了整数范围的迭代。以前我们可能会这么写:

for i := 0; i < 10; i++ {
     // 在 Go 1.22 之前,我们需要手动管理索引 i
     // 现在可以直接使用这个形式来迭代整数范围
}

现在可以更简洁地表达:

for i := range 0..10 {
    // Go 1.22 允许直接迭代从 0 到 10 的整数范围
}

这样写更直观,也更不容易出错,也能大大提高代码的可读性和安全性。不过也别担心,旧的写法还是能用的,编译器不会把你的老代码搞坏。

0条评论
0 / 1000
w****n
6文章数
0粉丝数
w****n
6 文章 | 0 粉丝
原创

go 1.22与之前版本关于for循环的注意点

2024-07-03 09:52:35
4
0

Go 1.22 给 for 循环带来了一些重要更新。主要有两点值得注意:

首先,循环变量不再共享了。这解决了一个老大难问题 - 在循环里启动 goroutine 时可能出现的诡异行为。以前,我们可能会遇到所有 goroutine 打印同一个值的情况,因为它们都引用了同一个变量。现在每次迭代都会创建新的变量实例,所以这个问题就不存在了。

举个例子:

values := []int{1, 2, 3}
  for i := range values {
      go func() {
          fmt.Println(i)
      }()
  }

在旧版本中,这段代码可能会打印出三个相同的数字。但在 Go 1.22 中,它会如我们所期望的那样,打印出 1、2、3(虽然顺序可能是随机的)。

其次,Go 1.22 简化了整数范围的迭代。以前我们可能会这么写:

for i := 0; i < 10; i++ {
     // 在 Go 1.22 之前,我们需要手动管理索引 i
     // 现在可以直接使用这个形式来迭代整数范围
}

现在可以更简洁地表达:

for i := range 0..10 {
    // Go 1.22 允许直接迭代从 0 到 10 的整数范围
}

这样写更直观,也更不容易出错,也能大大提高代码的可读性和安全性。不过也别担心,旧的写法还是能用的,编译器不会把你的老代码搞坏。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0