Как перейти к следующему элементу в слайсе

Я написал следующий код, чтобы получить следующий элемент в массиве.

count:=len(value.Values)
for index, currentRow := range value.Values {
    var nextRow Value
    if index< count{
    nextRow = value.Values[index+1]
    fmt.Print(nextRow)
    }
}

Я получаю панику при запуске вышеуказанного кода.

Горутинная паника: ошибка времени выполнения: индекс вне диапазона

Любая идея о том, как я могу получить следующий элемент из среза.

Сначала примечание по терминологии: вы используете срезы или массивы? Это не одно и то же

Jonathan Hall 21.12.2020 11:31

Во-вторых, вы успешно получаете «следующий элемент», но когда вы находитесь на последнем, следующего элемента нет, отсюда и паника. Решение зависит от вашей цели. Чего вы пытаетесь достичь?

Jonathan Hall 21.12.2020 11:32

@Flimzy, верно, я получаю следующий предмет, но впадаю в панику, когда следующего предмета нет. Моя цель - получить следующий элемент из среза, не паникуя, если следующего элемента нет.

Bonyfus Martin 21.12.2020 11:44

Затем выберите одно из решений в ответе ниже: либо пропустите проверку, когда вы уже находитесь на последней, либо выполните итерацию только по n-1 элементам.

Jonathan Hall 21.12.2020 11:45
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
1 750
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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 итераций.

Также обратите внимание, что перемещение по срезу, который исключает последний элемент, не посещает последний элемент (очевидно), поэтому, если вы будете делать что-то еще с элементами, это может оказаться нежизнеспособным, но в вашем примере они эквивалентны.

Другие вопросы по теме