Loop over array в языке Go

Можно ли перебирать индексы массива в языке Go и выбирать не все индексы, но вызывать некоторый период (например, 1, 2, 3.

Например,

for i, v := range array {
//do something with i,v
}

выполняет итерацию по всем индексам в массиве

Что я хочу знать, есть ли шанс иметь что-то вроде этого

for i:=1, v := range array {
//do something with i,v
i += 4
}

Ответ 1

Что случилось с

i := 1
for _, v := range array {
    // do something
    i += 4
}

если вы хотите i-значения, отличные от индексов, или если вы хотите пропустить индексы,

for i := 1; i < len(array); i += 4 {
    v := array[i]
}

?

Ответ 2

Вы ищете абстракцию, которая не существует в Голанге. Go "прост" по дизайну. Конечно, простое само по себе является очень относительным и субъективным термином. Например, для некоторых было бы просто:

// This is not real Go code
for index, value := range(array, stride = 4, start = 1) {
        ...
}

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

// This *is* real Go code
start  := 1   // we start not at 0 but at one, just for fun
stride := 4   // we skip 3 between this and the next one of interest
for i: = start; i < len(array); i += stride {
        ...
}

Этот код говорит вам, как что-то делается, и как побочный эффект, вы должны понимать, что делается. Маленькая абстракция - но это инженерный компромисс за то, что он был несколько быстрым и несколько прост. Большинство компромиссов в области Go ошибаются на стороне простоты и скорости.

Go позволяет создавать такую ​​абстракцию, хотя и с небольшим усилием.