slices.Delete în Go

Delete șterge elementele s[i:j]; DeleteFunc șterge toate elementele care îndeplinesc o condiție. Ambele returnează slice-ul nou.

Sintaxă
import "slices"

func Delete[S ~[]E, E any](s S, i, j int) S
func DeleteFunc[S ~[]E, E any](s S, del func(E) bool) S

Ce face slices.Delete

slices.Delete(s, i, j) scoate elementele de pe pozițiile de la i până la j-1 și mută restul spre stânga. Pentru un singur element scrii slices.Delete(s, i, i+1).

slices.DeleteFunc(s, del) scoate toate elementele pentru care del(element) returnează true: notele sub 5, produsele fără stoc, textele goale.

Ambele modifică memoria slice-ului inițial și returnează slice-ul mai scurt, pe care trebuie să-l atribui. Din Go 1.22, pozițiile rămase libere la final sunt puse pe valoarea zero, ca să nu țină în memorie obiecte inutile.

Parametri

Parametru Descriere
s Slice-ul.
i, j Pentru Delete: intervalul șters, [i, j). Dacă este invalid, programul se oprește cu panic.
del Pentru DeleteFunc: condiția elementelor șterse.

Ce returnează

Slice-ul fără elementele șterse.

Exemple

Exemplul 1: Ștergere după poziție

package main

import (
    "fmt"
    "slices"
)

func main() {
    orase := []string{"Iași", "Cluj", "Arad", "Brașov", "Sibiu"}
    orase = slices.Delete(orase, 1, 3) // scoate Cluj și Arad
    fmt.Println(orase)

    i := slices.Index(orase, "Brașov")
    orase = slices.Delete(orase, i, i+1)
    fmt.Println(orase)
}

Rezultat

[Iași Brașov Sibiu]
[Iași Sibiu]

Exemplul 2: Ștergere după o condiție

package main

import (
    "fmt"
    "slices"
    "strings"
)

func main() {
    note := []int{9, 4, 7, 3, 10, 5}
    note = slices.DeleteFunc(note, func(n int) bool { return n < 5 })
    fmt.Println(note)

    cuvinte := []string{"mere", "", "pere", "  ", "prune"}
    cuvinte = slices.DeleteFunc(cuvinte, func(c string) bool { return strings.TrimSpace(c) == "" })
    fmt.Println(cuvinte, len(cuvinte))
}

Rezultat

[9 7 10 5]
[mere pere prune] 3

Exemplul 3: Slice-ul inițial este modificat

Delete lucrează în aceeași memorie. Vechea variabilă vede elementele mutate și valori zero la final.

package main

import (
    "fmt"
    "slices"
)

func main() {
    original := []int{1, 2, 3, 4, 5}
    scurt := slices.Delete(original, 0, 2)
    fmt.Println(scurt)
    fmt.Println(original)
}

Rezultat

[3 4 5]
[3 4 5 0 0]

Greșeli frecvente

  • Nu atribui rezultatul (slices.Delete(s, i, i+1) singur): lungimea lui s rămâne aceeași și vezi valori zero la final.
  • Ștergi elemente dintr-un slice în timp ce îl parcurgi cu for i := range s: indicii se decalează. Folosește DeleteFunc.

Comenzi înrudite

  • slices.Insert: Inserează una sau mai multe valori la poziția i și returnează slice-ul rezultat.
  • slices.Compact: Înlocuiește fiecare șir de elemente egale consecutive cu un singur element (ca uniq din Unix).
  • slices.Index: Returnează poziția primei apariții a unei valori (Index) sau a primului element care îndeplinește o condiție (IndexFunc), ori -1.
  • maps.DeleteFunc: Șterge din map toate perechile pentru care funcția del(cheie, valoare) returnează true.