Подробнее об интерфейсах Go
Сравнения с использованием значений интерфейса
Есть два случая сравнений с использованием интерфейсных значений:
-
Сравнения между значением, не являющимся интерфейсом, и значением интерфейса.
-
Сравнения между двумя значениями интерфейса.
В первом случае тип неинтерфейсного значения должен реализовывать тип (предположим, что это I) интерфейсного значения, поэтому неинтерфейсное значение может быть преобразовано (упаковано) в интерфейсное значение I. Это означает, что сравнение между значением, не относящимся к интерфейсу, и значением интерфейса может быть преобразовано в сравнение между двумя значениями интерфейса. Поэтому ниже будут объяснены только сравнения между двумя значениями интерфейса.
Сравнение двух значений интерфейса фактически сравнивает их соответствующие динамические типы и динамические значения.
Этапы сравнения двух значений интерфейса (с \== оператором):
-
Если одно из двух значений интерфейса является нулевым, то результатом сравнения становится ответ на вопрос, является ли другое значение интерфейса также нулевым.
-
Если динамические типы двух значений интерфейса являются двумя разными типами, то результатом сравнения будет false.
-
В случае, когда динамические типы двух значений интерфейса имеют один и тот же тип, если тот же динамический тип является несравнимым типом, произойдет паника. В противном случае результат сравнения является результатом сравнения динамических значений двух значений интерфейса.
Два значения интерфейса равны, только если выполняется одно из следующих условий.
-
Они оба являются нулевыми значениями интерфейса.
-
Их динамические типы идентичны и сопоставимы, а их динамические значения равны друг другу.
По правилам, два значения интерфейса, оба из которых являются динамическими значениями nil, могут не совпадать. Пример: