Тип comparable

Тип comparable — это встроенный интерфейс в Go, который обозначает множество типов, значения которых можно сравнивать с помощью операторов == и !=. Этот интерфейс часто используется в дженериках (обобщенном программировании) как ограничение для параметров типа, чтобы гарантировать, что тип поддерживает операции сравнения.

Синтаксис

Тип comparable используется как ограничение в объявлении обобщенных функций или типов.

gofunc IsEqual[T comparable](a, b T) bool {
  return a == b
}

Также тип comparable можно использовать в качестве типа параметра для проверки возможности сравнения.

Пример

Давайте создадим обобщенную функцию, которая проверяет, равны ли два значения любого сравниваемого типа:

gopackage main

import "fmt"

func IsEqual[T comparable](a, b T) bool {
  return a == b
}

func main() {
  res1 := IsEqual(10, 10)
  fmt.Println(res1)

  res2 := IsEqual("abcde", "12345")
  fmt.Println(res2)

  res3 := IsEqual([]int{1, 2, 3}, []int{1, 2, 3})
  fmt.Println(res3)
}

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

gotrue
false
false

Обратите внимание, что слайсы не сравнимы, поэтому компилятор выдаст ошибку, если попытаться использовать comparable со слайсом.

Пример

Использование comparable в качестве ограничения для структуры данных, например, для множества (set):

gopackage main

import "fmt"

type Set[T comparable] struct {
  elements map[T]bool
}

func NewSet[T comparable]() *Set[T] {
  return &Set[T]{elements: make(map[T]bool)}
}

func (s *Set[T]) Add(value T) {
  s.elements[value] = true
}

func (s *Set[T]) Contains(value T) bool {
  return s.elements[value]
}

func main() {
  intSet := NewSet[int]()
  intSet.Add(10)
  intSet.Add(20)
  fmt.Println(intSet.Contains(10))
  fmt.Println(intSet.Contains(30))

  strSet := NewSet[string]()
  strSet.Add("abcde")
  fmt.Println(strSet.Contains("abcde"))
  fmt.Println(strSet.Contains("xyz"))
}

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

gotrue
false
true
false

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

  • тип any,
    который представляет собой пустой интерфейс и может хранить значения любого типа
  • тип string,
    который является сравниваемым типом и часто используется с comparable
  • тип int,
    который также поддерживает сравнение и может быть ограничением comparable
  • тип bool,
    который является сравниваемым типом и часто используется в логических операциях