Как эффективно очистить стандартные структуры данных в 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(...)

Ответ 18+ 🔞

А, ну вот, опять про эту очистку памяти, да? Ну слушай, тут всё просто, как три копейки, но с нюансами, блядь. Как будто мыть посуду: можно просто сполоснуть и оставить в раковине — быстро, но негигиенично. А можно засунуть в посудомойку и забыть — чисто, но долго. Вот и тут так же.

Слайсы, эти наши резиновые массивы

  1. Быстрая очистка, по-хамски.
    Хочешь просто обнулить счётчик, но оставить всё барахло на месте? Пожалуйста:

    s := []int{1, 2, 3, 4, 5}
    s = s[:0] // Всё, пиздец элементам. Но место-то под них осталось!

    Типа выкинул вещи из чемодана, но сам чемодан оставил. Удобно, если через пять минут снова ехать. capacity остался прежним, новые данные лягут туда же, без лишней суеты.

  2. Полный развод моста, по-взрослому.
    А если ты такой: «Да пошло оно всё нахуй, хочу, чтобы сборщик мусора прибрался»? Тогда делай так:

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

    Чемодан — в мусорный бак. Память освободится, но в следующий раз придётся новый чемодан покупать (аллоцировать).

Мапы, эти наши сумки-холодильники

  1. Цивилизованный способ (если у тебя Go 1.21+).
    Раньше тут была дичь, а теперь есть нормальная функция clear(). Красота, ёпта!

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

    Всё выкинул, но сама мапа (её внутренние вёдра, блядь) осталась на месте. Быстро и эффективно.

  2. Старый дедовский способ, универсальный.
    А если ты консерватор или пишешь под старьё? Тогда просто сделай новую сумку, а старую выброси:

    m := map[string]int{"a": 1, "b": 2}
    m = make(map[string]int) // Новая пустая сумка. Старую GC вынесет на помойку.

    Раньше, блядь, чтобы очистить старую, приходилось в цикле delete() вызывать для каждого ключа — это как выковыривать крошки из сумки по одной, пиздец какой кошмар. Теперь так не делают, не позорься.

Короткая шпаргалка, чтоб не ебал мозг

Что хочешь сделать Со слайсом С мапой (современный Go) С мапой (старый способ)
Быстро очистить, оставив место s = s[:0] clear(m) Цикл с delete (не делай так!)
Убить напрочь, чтобы память freed s = nil m = make(...) m = make(...)

Вот и вся наука, блядь. Главное — понимать, зачем ты это делаешь: либо ты бережёшь ресурсы и готовишься к новым данным, либо говоришь «да идите вы нахуй» и освобождаешь всё подчистую. Выбирай, как тебе удобнее, и не усложняй.