Spec-Zone.ru › Go

Пакет cmp

  • import "cmp"
  • Обзор
  • Указатель
  • Примеры

Обзор

Пакет cmp предоставляет типы и функции для сравнения упорядоченных значений.

Указатель

  • func Compare[T Ordered](x, y T) int
  • func Less[T Ordered](x, y T) bool
  • func Or[T comparable](vals ...T) T
  • type Ordered

Примеры

Compare
Less
Or
Or (сортировка)

Файлы пакета

cmp.go

func Compare 1.21

func Compare[T Ordered](x, y T) int

Compare возвращает

-1 if x is less than y,
 0 if x equals y,
+1 if x is greater than y.

Для типов с плавающей точкой NaN считается меньше любого значения, не являющегося NaN; NaN считается равным NaN, а -0.0 равен 0.0.

Пример

Код:

fmt.Println(cmp.Compare(1, 2))
fmt.Println(cmp.Compare("a", "aa"))
fmt.Println(cmp.Compare(1.5, 1.5))
fmt.Println(cmp.Compare(math.NaN(), 1.0))

Вывод:

-1
-1
0
-1

func Less 1.21

func Less[T Ordered](x, y T) bool

Less сообщает, меньше ли x, чем y. Для типов с плавающей точкой NaN считается меньше любого значения, не являющегося NaN, а -0.0 не меньше (то есть равен) 0.0.

Пример

Код:

fmt.Println(cmp.Less(1, 2))
fmt.Println(cmp.Less("a", "aa"))
fmt.Println(cmp.Less(1.0, math.NaN()))
fmt.Println(cmp.Less(math.NaN(), 1.0))

Вывод:

true
true
false
true

func Or 1.22

func Or[T comparable](vals ...T) T

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

Пример

Код:

// Suppose we have some user input
// that may or may not be an empty string
userInput1 := ""
userInput2 := "some text"

fmt.Println(cmp.Or(userInput1, "default"))
fmt.Println(cmp.Or(userInput2, "default"))
fmt.Println(cmp.Or(userInput1, userInput2, "default"))

Вывод:

default
some text
some text

Пример (сортировка)

Код:

type Order struct {
    Product  string
    Customer string
    Price    float64
}
orders := []Order{
    {"foo", "alice", 1.00},
    {"bar", "bob", 3.00},
    {"baz", "carol", 4.00},
    {"foo", "alice", 2.00},
    {"bar", "carol", 1.00},
    {"foo", "bob", 4.00},
}
// Sort by customer first, product second, and last by higher price
slices.SortFunc(orders, func(a, b Order) int {
    return cmp.Or(
        strings.Compare(a.Customer, b.Customer),
        strings.Compare(a.Product, b.Product),
        cmp.Compare(b.Price, a.Price),
    )
})
for _, order := range orders {
    fmt.Printf("%s %s %.2f\n", order.Product, order.Customer, order.Price)
}

Вывод:

foo alice 2.00
foo alice 1.00
bar bob 3.00
foo bob 4.00
bar carol 1.00
baz carol 4.00

type Ordered 1.21

Ordered — это ограничение типа, допускающее любой упорядоченный тип: любой тип, для которого поддерживаются операторы < <= >= >. Если в будущих версиях Go появятся новые упорядоченные типы, это ограничение будет изменено и будет включать их.

Обратите внимание, что значения типов с плавающей точкой могут быть NaN («не число»). Оператор, например == или <, всегда вернёт false при сравнении значения NaN с любым другим значением — NaN или нет. См. функцию Compare, которая обеспечивает согласованный способ сравнения значений NaN.

type Ordered interface {
    ~int | ~int8 | ~int16 | ~int32 | ~int64 |
        ~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr |
        ~float32 | ~float64 |
        ~string
}

© Google, Inc.
Licensed under the Creative Commons Attribution License 3.0.
http://golang.org/pkg/cmp/

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API