Тип comparable
Тип comparable — это встроенный интерфейс в Go,
который обозначает множество типов, значения которых
можно сравнивать с помощью операторов == и
!=. Этот интерфейс часто используется в
дженериках (обобщенном программировании) как ограничение
для параметров типа, чтобы гарантировать, что тип
поддерживает операции сравнения.
Синтаксис
Тип comparable используется как ограничение
в объявлении обобщенных функций или типов.
func IsEqual[T comparable](a, b T) bool {
return a == b
}
Также тип comparable можно использовать
в качестве типа параметра для проверки возможности
сравнения.
Пример
Давайте создадим обобщенную функцию, которая проверяет, равны ли два значения любого сравниваемого типа:
package 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)
}
Результат выполнения кода:
true
false
false
Обратите внимание, что слайсы не сравнимы,
поэтому компилятор выдаст ошибку, если попытаться
использовать comparable со слайсом.
Пример
Использование comparable в качестве
ограничения для структуры данных, например,
для множества (set):
package 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"))
}
Результат выполнения кода:
true
false
true
false
Смотрите также
-
тип
any,
который представляет собой пустой интерфейс и может хранить значения любого типа -
тип
string,
который является сравниваемым типом и часто используется сcomparable -
тип
int,
который также поддерживает сравнение и может быть ограничениемcomparable -
тип
bool,
который является сравниваемым типом и часто используется в логических операциях