Ответ
Способ очистки зависит от структуры данных и цели: нужно ли сохранить выделенную память для переиспользования или полностью освободить её.
Слайсы (Slices)
-
Очистка с сохранением
capacity(быстро): Этот способ "обнуляет" длину слайса, но оставляет базовый массив в памяти. Идеально для переиспользования.s := []int{1, 2, 3, 4, 5} // cap(s) == 5 s = s[:0] // len(s) == 0, cap(s) == 5 // Память не освобождена, готова к новому заполнению без аллокаций. -
Полное освобождение памяти: Чтобы сборщик мусора мог освободить память, занимаемую базовым массивом, присвойте слайсу
nil.s := make([]int, 1000000) // Большой слайс s = nil // Теперь GC может собрать массив, если на него нет других ссылок.
Мапы (Maps)
-
Очистка с помощью
clear()(Go 1.21+): Это самый эффективный и предпочтительный способ. Он удаляет все элементы, но сохраняет выделенную под мапу память для будущего использования.// Требуется Go 1.21 или новее m := map[string]int{"a": 1, "b": 2} clear(m) // len(m) == 0, но память под бакеты сохранена. -
Пересоздание мапы (универсальный способ): Этот способ создает новую пустую мапу, а старая будет убрана сборщиком мусора. Это приводит к новой аллокации памяти.
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+ 🔞
А, ну вот, опять про эту очистку памяти, да? Ну слушай, тут всё просто, как три копейки, но с нюансами, блядь. Как будто мыть посуду: можно просто сполоснуть и оставить в раковине — быстро, но негигиенично. А можно засунуть в посудомойку и забыть — чисто, но долго. Вот и тут так же.
Слайсы, эти наши резиновые массивы
-
Быстрая очистка, по-хамски.
Хочешь просто обнулить счётчик, но оставить всё барахло на месте? Пожалуйста:s := []int{1, 2, 3, 4, 5} s = s[:0] // Всё, пиздец элементам. Но место-то под них осталось!Типа выкинул вещи из чемодана, но сам чемодан оставил. Удобно, если через пять минут снова ехать.
capacityостался прежним, новые данные лягут туда же, без лишней суеты. -
Полный развод моста, по-взрослому.
А если ты такой: «Да пошло оно всё нахуй, хочу, чтобы сборщик мусора прибрался»? Тогда делай так:s := make([]int, 1000000) // Нахерали кучу мусора s = nil // Всё, свободен! Теперь GC может это всё вынести, как старый диван.Чемодан — в мусорный бак. Память освободится, но в следующий раз придётся новый чемодан покупать (аллоцировать).
Мапы, эти наши сумки-холодильники
-
Цивилизованный способ (если у тебя Go 1.21+).
Раньше тут была дичь, а теперь есть нормальная функцияclear(). Красота, ёпта!// Требуется Go 1.21 или новее, не будь лузером m := map[string]int{"a": 1, "b": 2} clear(m) // Просто вытряхнул сумку. Сама сумка осталась, чистая.Всё выкинул, но сама мапа (её внутренние вёдра, блядь) осталась на месте. Быстро и эффективно.
-
Старый дедовский способ, универсальный.
А если ты консерватор или пишешь под старьё? Тогда просто сделай новую сумку, а старую выброси: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(...) |
Вот и вся наука, блядь. Главное — понимать, зачем ты это делаешь: либо ты бережёшь ресурсы и готовишься к новым данным, либо говоришь «да идите вы нахуй» и освобождаешь всё подчистую. Выбирай, как тебе удобнее, и не усложняй.