Я написал следующий код, чтобы получить следующий элемент в массиве.
count:=len(value.Values)
for index, currentRow := range value.Values {
var nextRow Value
if index< count{
nextRow = value.Values[index+1]
fmt.Print(nextRow)
}
}
Я получаю панику при запуске вышеуказанного кода.
Горутинная паника: ошибка времени выполнения: индекс вне диапазона
Любая идея о том, как я могу получить следующий элемент из среза.
Во-вторых, вы успешно получаете «следующий элемент», но когда вы находитесь на последнем, следующего элемента нет, отсюда и паника. Решение зависит от вашей цели. Чего вы пытаетесь достичь?
@Flimzy, верно, я получаю следующий предмет, но впадаю в панику, когда следующего предмета нет. Моя цель - получить следующий элемент из среза, не паникуя, если следующего элемента нет.
Затем выберите одно из решений в ответе ниже: либо пропустите проверку, когда вы уже находитесь на последней, либо выполните итерацию только по n-1
элементам.
Следующий элемент действительно value.Values[index+1]
, но если index
является индексом последнего элемента, следующего элемента нет, в этом случае index+1
является недопустимым индексом для value.Values
, и попытка его использования приводит к панике во время выполнения.
Так что проверьте индекс:
for index, currentRow := range value.Values {
var nextRow Value
if index < timeSeriesDataCount && index < len(value.Values)-1 {
nextRow = value.Values[index+1]
fmt.Print(nextRow)
}
}
Другой вариант — выбрать срез, в котором меньше единицы (исключить последний элемент), поэтому нет необходимости проверять index
, наверняка есть еще один элемент:
for index, currentRow := range value.Values[:len(value.Values)-1] {
var nextRow Value
if index < timeSeriesDataCount {
nextRow = value.Values[index+1]
fmt.Print(nextRow)
}
}
В этом случае вам нужно подумать о том, пусто ли value.Values
, потому что если это так, описанная выше операция нарезки снова вызовет панику, поэтому проверьте следующее:
if len(value.Values) > 0 {
for index, currentRow := range value.Values[:len(value.Values)-1] {
var nextRow Value
if index < timeSeriesDataCount {
nextRow = value.Values[index+1]
fmt.Print(nextRow)
}
}
}
Обратите внимание, что мы могли бы проверить, если len(value.Values) > 1
, потому что даже если не будет паники, если len = 1
, будет 0
итераций.
Также обратите внимание, что перемещение по срезу, который исключает последний элемент, не посещает последний элемент (очевидно), поэтому, если вы будете делать что-то еще с элементами, это может оказаться нежизнеспособным, но в вашем примере они эквивалентны.
Сначала примечание по терминологии: вы используете срезы или массивы? Это не одно и то же