Функция slices.CompareFunc

Функция slices.CompareFunc из пакета slices сравнивает два слайса поэлементно, используя переданную пользовательскую функцию для определения порядка элементов. Она возвращает int: отрицательное число, если первый слайс меньше второго, ноль, если слайсы равны, и положительное число, если первый слайс больше второго. Первым и вторым параметрами функция принимает сравниваемые слайсы, третьим — функцию сравнения, которая должна возвращать отрицательное, нулевое или положительное значение для двух элементов.

Синтаксис

goslices.CompareFunc(s1, s2, func(a, b T) int {
  // логика сравнения
})

Пример

Сравним два слайса целых чисел по возрастанию:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  s1 := []int{1, 2, 3}
  s2 := []int{1, 2, 4}

  res := slices.CompareFunc(s1, s2, func(a, b int) int {
    if a < b {
      return -1
    } else if a > b {
      return 1
    }
    return 0
  })

  fmt.Println(res)
}

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

go-1

Функция вернула -1, потому что на третьей позиции элемент 3 меньше 4.

Пример

Сравним два слайса строк по длине элементов:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  s1 := []string{"a", "bb", "ccc"}
  s2 := []string{"a", "bb", "dd"}

  res := slices.CompareFunc(s1, s2, func(a, b string) int {
    if len(a) < len(b) {
      return -1
    } else if len(a) > len(b) {
      return 1
    }
    return 0
  })

  fmt.Println(res)
}

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

go0

Функция вернула 0, потому что длины элементов на всех позициях совпадают: "ccc" и "dd" имеют длину 3 и 2 соответственно.

Пример

Сравним слайсы, где первый меньше второго из-за длины:

gopackage main

import (
  "fmt"
  "slices"
)

func main() {
  s1 := []int{1, 2}
  s2 := []int{1, 2, 3}

  res := slices.CompareFunc(s1, s2, func(a, b int) int {
    return a - b
  })

  fmt.Println(res)
}

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

go-1

Функция вернула -1, так как первый слайс закончился раньше, и считается меньшим.

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

  • функцию slices.Compare,
    которая сравнивает слайсы по стандартному порядку
  • функцию slices.EqualFunc,
    которая проверяет равенство слайсов с произвольной логикой
  • функцию slices.SortFunc,
    которая сортирует слайс с пользовательской функцией
  • функцию slices.IndexFunc,
    которая ищет первый элемент, удовлетворяющий условию