如果您修改正在遍历的切片,会发生什么?

huangapple go评论85阅读模式
英文:

What happens if I modify the slice I'm ranging over?

问题

我最近注意到我做了这个:

for t, ts := range timespans {
    // 移除当前项
    if t+1 < len(timespans) {
        timespans = append(timespans[:t], timespans[t+1:]...)
    } else {
        timespans = timespans[:t]
    }
}

其中:

var timespans []TimeSpan

type TimeSpan [2]time.Time

range 在内部是如何工作的?

它像 for i:=0; i<42; i++ 循环一样工作(跳过项),还是它遍历了 timespans 的副本,就像在循环开始时看到的那样,或者还有其他什么方式?

英文:

I recently noticed that I had done this:

for t, ts := range timespans {
	// remove current item
	if t+1 &lt; len(timespans) {
		timespans = append(timespans[:t], timespans[t+1:]...)
	} else {
		timespans = timespans[:t]
	}

where

var timespans []TimeSpan

and

type TimeSpan [2]time.Time

How does range's work internally?

Does it work like a for i:=0; i&lt;42; i++ loop (and skip items) or does it range over a copy of timespans, as it looked when the loop first started, or something else?

答案1

得分: 2

它在切片的副本上工作,你可以直接修改切片的数据,但它会忽略追加(append)等操作。

英文:

It works on a copy of the slice, you can modify the slice's data in place but it will ignore append and such.

答案2

得分: 1

刚刚在语言规范中找到了答案。

> 在开始循环之前,范围表达式会被评估一次[...]`

所以它在副本上操作。太棒了!

英文:

Just found the answer in the language specification.

> The range expression is evaluated once before beginning the loop[...]`

So it operates on a copy. Awesome!

huangapple
  • 本文由 发表于 2014年10月26日 05:28:30
  • 转载请务必保留本文链接:https://go.coder-hub.com/26567420.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定