2014-10-25 7 views
2

Недавно я заметил, что я сделал это:Что произойдет, если я изменю срез, который у меня есть?

for t, ts := range timespans { 
    // remove current item 
    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 «s работа внутри?

Работает ли он как цикл for i:=0; i<42; i++ (и пропускает элементы), или он находится на расстоянии timespans, так как он выглядел, когда цикл начинался первым или что-то еще?

ответ

1

Только что нашел ответ в спецификации языка.

Выражение диапазон вычисляется один раз перед началом цикла [...] `

Так он работает на копии. Потрясающие!

2

Он работает с копией фрагмента, вы можете изменить данные среза на месте, но он будет игнорировать append и т. Д.

Смежные вопросы