воскресенье, 9 июня 2019 г.

Спецификация Go: операторы сравнения

Операторы сравнения сравнивают два операнда и выдают нетипизированное логическое значение.

==    равно
!=    не равно
<     меньше
<=    меньше или равно
>     больше
>=    больше или равно

В любом сравнении первый операнд должен быть присваиваемым (assignable) типу второго операнда или наоборот.

Операторы равенства == и != применяются к операндам, которые сравнимы. Операторы упорядочения <, <=, > и >= применяются к упорядоченным операндам. Эти термины и результат сравнений определяются следующим образом:

  • Булевы значения сопоставимы. Два логических значения равны, если они оба либо true, либо оба false.
  • Целочисленные значения сравнимы и упорядочены обычным способом.
  • Значения с плавающей точкой сопоставимы и упорядочены, как определено стандартом IEEE-754. Комплексные значения сопоставимы. Два комплексных значения u и v равны, если оба real(u) == real(v) и imag(u) == imag(v).
  • Строковые значения сравнимы и упорядочены, лексически в байтовом выражении.
  • Значения указателя сравнимы. Два значения указателя равны, если они указывают на одну и ту же переменную или если оба имеют значение nil. Указатели на различные переменные нулевого размера могут совпадать или не совпадать.
  • Значения канала сравнимы. Два значения канала равны, если они были созданы одним и тем же вызовом make или оба имеют значение nil.
  • Значения интерфейса сравнимы. Два значения интерфейса равны, если они имеют идентичные динамические типы и одинаковые динамические значения или оба имеют значение nil.
  • Значение x неинтерфейсного типа X и значение t интерфейсного типа T сравнимы, когда значения типа X сравнимы и X реализует T. Они равны, если динамический тип t идентичен X, а динамическое значение t равно x.
  • Значения структур сравнимы, если все их поля сравнимы. Два значения структуры равны, если их соответствующие непустые поля равны.
  • Значения массива сравнимы, если значения типа элемента массива сравнимы. Два значения массива равны, если их соответствующие элементы равны.

Сравнение двух значений интерфейса с идентичными динамическими типами вызывает панику во время выполнения, если значения этого типа не сравнимы. Такое поведение применимо не только к прямому сравнению значений интерфейса, но также при сравнении массивов значений интерфейса или структур с полями с интерфейсным значением.

Значения среза, карты и функции не сравнимы. Однако в особом случае значение среза, карты или функции можно сравнить с предварительно объявленным идентификатором nil. Сравнение значений указателя, канала и интерфейса с nil также допускается и следует из общих правил, приведенных выше.

const c = 3 < 4   // c это нетипизированная булева постоянная true

type MyBool bool
var x, y int
var (
  // Результат сравнения это нетипизированное булево значение.
  // Применяются обычные правила присваивания.
  b3        = x == y // b3 имеет тип bool
  b4 bool   = x == y // b4 имеет тип bool
  b5 MyBool = x == y // b5 имеет тип MyBool
)


Читайте также:


Комментариев нет:

Отправить комментарий