Как получить срез (slice) из N первых элементов другого среза?

Ответ

Для получения среза, содержащего 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)
}

Важные моменты и крайние случаи:

  1. Если N превышает длину среза: Паники не будет. Операция вернёт копию всего исходного среза.

    s := []int{1, 2, 3}
    allElements := s[:10] // OK, вернёт [1, 2, 3]
  2. Безопасный способ: Если N может быть переменной, и вам нужно строго N элементов или меньше (если срез короче), можно использовать встроенную функцию min (Go 1.21+) или её аналог.

    n := 3
    // Гарантирует, что индекс не выйдет за пределы длины среза
    safeSlice := s[:min(n, len(s))]
  3. Пустой или nil срез: Операция среза для nil или пустого среза безопасна и вернёт nil или пустой срез соответственно. Паники не произойдёт.

    var nilSlice []int
    result := nilSlice[:0] // OK, result будет nil
  4. Когда происходит паника?: Паника (panic: runtime error: slice bounds out of range) произойдёт, если левая или правая граница среза выходит за пределы его ёмкости (capacity), или если левая граница больше правой (s[3:1]).