Весь свой выходной день делаю одну штуку, связанную со сравнением значений разными способами (почти как
4 года назад), перечитываю спеку языка раз за разом. И вдруг заметил такое бревно в глазу языке, что теперь не могу развидеть.
В спеке есть понятия
comparable и strictly comparable: «The
equality operators == and != apply to operands of
comparable types. The
ordering operators <, <=, >, and >= apply to operands of
ordered types».
Ordered операторы применяются к
ordered типам – всё нормально. А вот
equality операторы применяются к
comparable типам – используется другое слово, как-то немного странно, но сойдёт.
Но дальше хуже. Есть в стандартной библиотеке пакет
cmp, название которого явно происходит от слова
compare, и название функции
Compare говорит о том же. Что должна делать это функция? Если
comparable типы – это про
equality операторы, то, по идее, она должна просто (может,
с поправкой на NaN) использовать ==. Но нет, она использует
ordered операторы и типы.
Пошёл смотреть почему же нет
cmp.Equal. И это просто
портал в ад:
Equal([2]float64{nan, 456}, [2]float64{123, nan}) // true
Какая же мораль? Как обычно, NaN всё портит. Go – не такой простой язык, как кажется (никакой язык не такой простой, как кажется, но мы же тут про Go), но английский – ещё сложнее. А мне, видимо, надо отдыхать в выходной день без чтения спеки.