Операторы сравнения сравнивают два операнда и выдают нетипизированное логическое значение.
== равно
!= не равно
< меньше
<= меньше или равно
> больше
>= больше или равно
В любом сравнении первый операнд должен быть присваиваемым (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
)
Читайте также:
- Спецификация Go: операторы, приоритет операторов
- Спецификация Go: лексические элементы
- Спецификация Go: выражения (expressions) - операнды, квалифицированные идентификаторы
Комментариев нет:
Отправить комментарий