Нарезка: ошибка выхода за границы в 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.
Нарезка Правила
При нарезке среза или массива указанные индексы могут быть явными или неявными. Если индекс не указан явно, по умолчанию ему присваивается определенное значение. Для срезов:
В данном коде ошибка возникает, поскольку выражение среза для создания среза 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