2017-01-03 3 views
3

У меня довольно простой вопрос, но я не могу найти ответ нигде. Я итерация ряд ломтиков, как это:Показатели цикла цикла для диапазона на фрагменте

for index, arg := range os.Args[1:] { 
    s += fmt.Sprintf("%d: %s", index, arg) 
} 

Как я понимаю range перебирает кусочком, и index создается из диапазона, и это с нуля. Я получаю результат:

0: argument_1 
1: argument_2 
// etc. 

Но это не то, что я ожидаю, - мне нужно range сохранить показатели этого среза, поэтому мой результат выглядит следующим образом:

1: argument_1 
2: argument_2 
// etc. 

Самый очевидный способ для достижения этой цели является добавление shift на индекс в цикле:

shift := 1 
for index, arg := range os.Args[shift:] { 
    index += shift 
    s += fmt.Sprintf("%d: %s", index, arg) 
} 

Но мне было интересно, есть ли более «Go-иш» способ сделать это, а также, как сохранить показатели при создании среза в Go как это?

+0

В вашем примере 'shift' вы добавляете 1 к индексу каждый раз в дополнение к обычному приращению цикла for. Разве это не решило бы чтение только аргументов 1, 3, 5 и т. Д.? –

+2

@MateiRadu Нет, индекс переназначается для каждого цикла, поэтому код работает. Вероятно, это выглядело бы лучше с новой переменной типа «originalIndex: = index + 1», хотя –

+0

@FranckJeannin Спасибо за объяснение, она очистила мои сомнения в том, как работает «range». –

ответ

3

Там нет ничего плохого в исходном коде, когда вы делаете os.Args[1:] вы создаете новый фрагмент, который, как начинается любой фрагмент с индексом 0.
Это вопрос стиля (и производительности), но вы также можете сделать это :

for index, arg := range os.Args { 
    if index < 1 { 
     continue 
    } 
    s += fmt.Sprintf("%d: %s", index, arg) 
} 
+0

Спасибо, что ответили! – Nevertheless

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