英文:
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 < 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<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!
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论