Какие подводные камни у слайсов

«Какие подводные камни у слайсов» — вопрос из категории Golang, который задают на 24% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Основные подводные камни слайсов в Go:

  1. Изменение базового массива
    Слайсы ссылаются на один массив. Изменения в одном слайсе могут повлиять на другой:
    a := []int{1, 2, 3}
    b := a[:2]
    b[0] = 9 // a[0] тоже изменится!
  1. Утечки памяти
    Слайс держит ссылку на весь массив, даже если нужна только часть:
    bigData := make([]byte, 1<<20) // 1MB
    smallPart := bigData[:10]      // держит ссылку на весь 1MB
  1. Append и capacity
    При добавлении элементов может создаться новый массив:
    s := []int{1, 2, 3}
    s = append(s, 4) // может изменить базовый массив
  1. Сравнение с nil
    Пустой слайс != nil, если создан через make:
    var s1 []int     // s1 == nil
    s2 := []int{}    // s2 != nil
    s3 := make([]int, 0) // s3 != nil
  1. Передача в функции
    Слайсы передаются по значению (копируется заголовок), но данные остаются общими:
    func modify(s []int) {
        s[0] = 100 // изменит оригинал
        s = append(s, 5) // не изменит оригинал, если не вернуть
    }