Как эффективно очистить стандартные структуры данных в Go (слайсы, мапы)?

Ответ

Способ очистки зависит от структуры данных и цели: нужно ли сохранить выделенную память для переиспользования или полностью освободить её.

Слайсы (Slices)

  1. Очистка с сохранением capacity (быстро): Этот способ "обнуляет" длину слайса, но оставляет базовый массив в памяти. Идеально для переиспользования.

    s := []int{1, 2, 3, 4, 5}
    // cap(s) == 5
    s = s[:0] 
    // len(s) == 0, cap(s) == 5
    // Память не освобождена, готова к новому заполнению без аллокаций.
  2. Полное освобождение памяти: Чтобы сборщик мусора мог освободить память, занимаемую базовым массивом, присвойте слайсу nil.

    s := make([]int, 1000000) // Большой слайс
    s = nil // Теперь GC может собрать массив, если на него нет других ссылок.

Мапы (Maps)

  1. Очистка с помощью clear() (Go 1.21+): Это самый эффективный и предпочтительный способ. Он удаляет все элементы, но сохраняет выделенную под мапу память для будущего использования.

    // Требуется Go 1.21 или новее
    m := map[string]int{"a": 1, "b": 2}
    clear(m)
    // len(m) == 0, но память под бакеты сохранена.
  2. Пересоздание мапы (универсальный способ): Этот способ создает новую пустую мапу, а старая будет убрана сборщиком мусора. Это приводит к новой аллокации памяти.

    m := map[string]int{"a": 1, "b": 2}
    m = make(map[string]int)
    // Старая мапа будет удалена GC.
Действие Слайс Мапа (Go 1.21+) Мапа (старые версии)
Очистить, сохранив память s = s[:0] clear(m) for k := range m { delete(m, k) } (неэффективно)
Очистить и освободить память s = nil m = make(...) m = make(...)