Сравнение значений Go

Сопоставимость по типу

Базовые типы данных всегда сопоставимы с использованием==и!=операторы:целое числозначения,плавающая точкачисласложныйчислалогическийзначения,нитьзначения,постоянныйзначения.

Множествозначения сопоставимы, если они содержат сопоставимый тип элемента

Указательзначения сопоставимы.

Каналзначения сопоставимы.

Интерфейсзначения сопоставимы.

Сравнениеинтерфейсvalues работает, только если динамический тип сопоставим.

Функциязначения,Ломтикценности икартаценностинетсопоставимы, их можно сравнить только сnil, как частный случай.

Правила сравнения

Из спецификации Go:

  • Логическийзначения сопоставимы. Два логических значения равны, если они обаtrueили обаfalse.

  • Целое числозначения сопоставимы и упорядочены обычным образом.

  • Плавающая точказначения сопоставимы и упорядочены, как определеноIEEE-754стандарт.

  • Сложныйзначения сопоставимы. Два комплексных значения u и v равны, если обаreal(u) == real(v)andimag (u) == imag (v) `.

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

  • Указательзначения сопоставимы. Два значения указателя равны, если они указывают на одну и ту же переменную или оба имеют значениеnil. Указатели на различные переменные нулевого размера могут быть одинаковыми, а могут и не совпадать.

  • Каналзначения сопоставимы. Два значения канала равны, если они были созданы одним и тем же вызовом to make или оба имеют значение.nil.

  • Интерфейсзначения сопоставимы. Два значения интерфейса равны, если они имеют одинаковые динамические типы и одинаковые динамические значения или оба имеют значениеnil.

  • Значение x изне интерфейстипXи значениеtизинтерфейстипTсравнимы, когда значения типаXсопоставимы иXорудияT. Они равны, еслиtдинамический тип идентиченXа динамическое значение t равноx.

  • Structзначения сопоставимы, если все их поля сопоставимы. Два значения структуры равны, если их соответствующие непустые поля равны.

  • Множествозначения сопоставимы, если сопоставимы значения типа элемента массива. Два значения массива равны, если равны их соответствующие элементы.

Неудачное сравнение

Если структура содержит поле, тип которого не сопоставим, при сравнении вы получите ошибку времени компиляции.

Сравнение несравненных типов: введитеrefect.DeepEqual()

Вreflectпакет stdlib предоставляетreflect.DeepEqual()функция, которая принимает 2 типа и возвращает логическое значение:

func DeepEqual(x, y interface{}) bool

Значения разных типов никогда не бывают полностью равными, поэтому, если вы передадите 2 разных типа, вы всегда получитеfalse.

Множествозначения глубоко равны, когда их соответствующие элементы глубоко равны.

Structзначения глубоко равны, если их соответствующие поля глубоко равны.

Funcзначения глубоко равны, если обаnil; в остальном они не очень равны.

Интерфейсценности глубоко равны, если они содержат глубоко равные конкретные ценности.

картазначения полностью равны, если все следующие верны: - они обаnilили оба не-nil- они имеют одинаковую длину - это один и тот же объект карты или соответствующие им ключи (сопоставленные с использованием равенства Go), отображающие глубоко равные значения.

Указательзначения глубоко равны, если они равны с использованием Go==оператор или если они указывают на глубоко равные значения.

Ломтикзначения полностью равны, если все следующие верны: - они обаnilили оба не-nil- они имеют одинаковую длину, - они указывают на одну и ту же начальную запись одного и того же базового массива (т. е.&x[0] == &y[0]) или их соответствующие элементы (по длине) глубоко равны.

Пустой фрагмент, отличный от нуля, иnilсрез (например,[]byte{}и[]byte(nil)) не очень равны.

Другие значения -числа,буллы,струны, иканалы- глубоко равны, если они равны с использованием оператора Go ==.

Стоит перечислить некоторые неизбежные «особые» случаи:значение может быть неравным самому себе: - потому что этоfuncтип - потому что это с плавающей запятойNaNценность - потому что этомножество,структура, или жеинтерфейссодержащий такое значение

Значения указателя всегда равны сами себе, даже если они указывают на такие проблемные значения или содержат их, потому что они сравнивают равные с помощью Go==оператора, и это достаточное условие для полного равенства, независимо от содержания.

То же самое относится кломтикиикарты: еслиxиy- это один и тот же фрагмент или одна и та же карта, они абсолютно равны независимо от содержимого.


Больше руководств по go: