«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Почему я получаю ошибку «Границы среза выходят за пределы диапазона» при нарезке Go?

Почему я получаю ошибку «Границы среза выходят за пределы диапазона» при нарезке Go?

Опубликовано 21 декабря 2024 г.
Просматривать:582

Why Do I Get a Slice Bounds Out of Range Error in Go Slicing?

Нарезка: ошибка выхода за границы в Go

В Go нарезка включает в себя извлечение части существующего среза для создания нового кусочек. Когда во время среза возникает ошибка выхода за границы, это означает, что указанный диапазон превышает допустимые границы индекса для исходного среза.

Рассмотрите следующий фрагмент кода:

a := make([]int, 5)
printSlice("a", a)
b := make([]int, 0, 5)
printSlice("b", b)
c := b[1:]
printSlice("c", c)

}

func printSlice(s string, x []int) {

fmt.Printf("%s len=%d cap=%d %v\n",
    s, len(x), cap(x), x)

}

Выполнение этого кода приводит к ошибке выхода за границы:

a len=5 cap=5 [0 0 0 0 0]
b len=0 cap=5 []
panic: runtime error: slice bounds out of range

goroutine 1 [running]:
main.main()
   /private/var/folders/q_/53gv6r4s0y5f50v9p26qhs3h00911v/T/compile117.go:10  0x150

Чтобы понять, почему возникает эта ошибка, нам нужно углубиться в правила, регулирующие нарезку в Go.

Нарезка Правила

При нарезке среза или массива указанные индексы могут быть явными или неявными. Если индекс не указан явно, по умолчанию ему присваивается определенное значение. Для срезов:

  • Отсутствующая нижняя граница по умолчанию равна 0.
  • Отсутствующая верхняя граница по умолчанию равна len(slice) (не cap(slice)).

В данном коде ошибка возникает, поскольку выражение среза для создания среза c:

c := b[1:]

Это означает, что нижняя граница (1) указана явно, а верхняя граница — нет. Поэтому по умолчанию используется значение len(b), которое равно 0. Однако указанная нижняя граница (1) должна быть меньше или равна верхней границе (0). Это условие не выполняется, что приводит к ошибке выхода за пределы.

Чтобы избежать этой ошибки, вы можете явно указать как нижнюю, так и верхнюю границы. Например, чтобы извлечь только второй элемент из среза b, вы должны написать:

c := b[1:2] // c len=1 cap=4 [0]

В качестве альтернативы, если вы хотите извлечь весь фрагмент b, начиная со второго элемента, вы можете использовать:

c := b[1:cap(b)] // c len=4 cap=4 [0 0 0 0]
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3