Переходная недвижимость на Голанге - PullRequest
0 голосов
/ 12 мая 2018

Этот фрагмент кода выглядит довольно нелогичным для меня:

var first *byte
var second interface{}

fmt.Println(first, first == nil)       // <nil> true
fmt.Println(second, second == nil)     // <nil> true
fmt.Println(first == second)           // false

Насколько я понимаю, дело в том, что первая переменная является указателем на пустую переменную типа byte,тогда как второй - пустой интерфейс.Итак, поскольку переменные не одного типа, они не считаются равными.

Но если они не равны друг другу, как они могут быть равны какому-то третьему значению?Это обычная ситуация в языках программирования, когда переходный закон не соблюдается?

Ответы [ 3 ]

0 голосов
/ 14 мая 2018

Ноль представляет нулевое значение, но каждое значение в go также имеет тип.

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

0 голосов
/ 06 января 2019

Вот более интересный пример непереходности оператора 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, но второе и третье имеют интерфейс типа {}.Как только типы удалены, преобразования интерфейса становятся явными, и каждое "==" заменяется соответствующим оператором сравнения для его типа.Эти операторы сравнения, по отдельности, являются истинными отношениями эквивалентности, то есть они транзитивны.

0 голосов
/ 12 мая 2018

Идентификатор nil представляет нулевое значение для типа канала, указателя, интерфейса, функции, карты и среза.

Нулевое значение для *byte не равно нулевому значению для interface{}.

...