Вот более интересный пример непереходности оператора Go's ==.Это не полагается на ноль;для таких типов, как функции и карты, x == nil лучше всего рассматривать как специальный оператор, поскольку значения этих типов не сопоставимы друг с другом.
// "hello" != x == s == "hello"
func main() {
type S string
var s S = "hello"
var x interface{} = s
fmt.Println(s == "hello") // s == "hello"
fmt.Println(x == s) // x == s
fmt.Println(x == "hello") // x != "hello"
}
В одну сторонуобъяснить эту аномалию в том, что здесь действительно работают два разных оператора равенства.Первое сравнение имеет тип S, но второе и третье имеют интерфейс типа {}.Как только типы удалены, преобразования интерфейса становятся явными, и каждое "==" заменяется соответствующим оператором сравнения для его типа.Эти операторы сравнения, по отдельности, являются истинными отношениями эквивалентности, то есть они транзитивны.