Функция slices.Compact

Функция slices.Compact удаляет последовательные дубликаты из слайса. Она возвращает новый слайс, содержащий исходные элементы, но без повторяющихся значений, которые идут друг за другом. В первый параметр функция принимает слайс любого типа, сравнивая элементы с помощью оператора ==.

Важно отметить, что функция не изменяет исходный слайс, а создает новый. Она удаляет только те дубликаты, которые находятся рядом. Например, в слайсе [1, 1, 2, 2, 3] останутся [1, 2, 3], а в слайсе [1, 2, 2, 1, 1] - [1, 2, 1].

Синтаксис

goslices.Compact(slice)

Пример

Давайте удалим последовательные дубликаты из слайса []int{1, 1, 2, 2, 3, 3, 4}:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  nums := []int{1, 1, 2, 2, 3, 3, 4}
  res := slices.Compact(nums)
  fmt.Println(res)
}

Результат выполнения кода:

go[1 2 3 4]

Пример

Рассмотрим случай, где дубликаты не идут подряд. Для слайса []string{"a", "b", "b", "a", "a", "c"}:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  strs := []string{"a", "b", "b", "a", "a", "c"}
  res := slices.Compact(strs)
  fmt.Println(res)
}

Результат выполнения кода:

go[a b a c]

Как видите, были удалены только соседние дубликаты "b" и "a", но дубликат "a" в позиции 3 и 4 остался, так как между ними нет других элементов.

Пример

Функция работает и с пустым слайсом. Давайте проверим:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  empty := []int{}
  res := slices.Compact(empty)
  fmt.Println(res)
}

Результат выполнения кода:

go[]

Пример

Если слайс не содержит последовательных дубликатов, функция вернет его копию. Например:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  nums := []int{1, 2, 3, 4, 5}
  res := slices.Compact(nums)
  fmt.Println(res)
}

Результат выполнения кода:

go[1 2 3 4 5]

Смотрите также

  • функцию slices.CompactFunc,
    которая удаляет последовательные дубликаты с использованием своей функции сравнения
  • функцию slices.Clone,
    которая создает копию слайса
  • функцию slices.Equal,
    которая сравнивает два слайса на равенство
  • функцию slices.Delete,
    которая удаляет элементы из слайса по индексам