Ответ
Для получения среза, содержащего N
первых элементов, используется операция slice[:N]
. Этот новый срез будет ссылаться на тот же базовый массив, что и исходный.
Основной синтаксис
package main
import "fmt"
func main() {
s := []int{10, 20, 30, 40, 50}
// Получаем первые 3 элемента
firstThree := s[:3] // [10, 20, 30]
fmt.Printf("Исходный срез: %vn", s)
fmt.Printf("Первые 3 элемента: %vn", firstThree)
}
Важные моменты и крайние случаи:
-
Если
N
превышает длину среза: Паники не будет. Операция вернёт копию всего исходного среза.s := []int{1, 2, 3} allElements := s[:10] // OK, вернёт [1, 2, 3]
-
Безопасный способ: Если
N
может быть переменной, и вам нужно строгоN
элементов или меньше (если срез короче), можно использовать встроенную функциюmin
(Go 1.21+) или её аналог.n := 3 // Гарантирует, что индекс не выйдет за пределы длины среза safeSlice := s[:min(n, len(s))]
-
Пустой или
nil
срез: Операция среза дляnil
или пустого среза безопасна и вернётnil
или пустой срез соответственно. Паники не произойдёт.var nilSlice []int result := nilSlice[:0] // OK, result будет nil
-
Когда происходит паника?: Паника (
panic: runtime error: slice bounds out of range
) произойдёт, если левая или правая граница среза выходит за пределы его ёмкости (capacity
), или если левая граница больше правой (s[3:1]
).