Skip to content

Подробнее об интерфейсах Go

Сравнения с использованием значений интерфейса

Есть два случая сравнений с использованием интерфейсных значений:

  1. Сравнения между значением, не являющимся интерфейсом, и значением интерфейса.

  2. Сравнения между двумя значениями интерфейса.

В первом случае тип неинтерфейсного значения должен реализовывать тип (предположим, что это I) интерфейсного значения, поэтому неинтерфейсное значение может быть преобразовано (упаковано) в интерфейсное значение I. Это означает, что сравнение между значением, не относящимся к интерфейсу, и значением интерфейса может быть преобразовано в сравнение между двумя значениями интерфейса. Поэтому ниже будут объяснены только сравнения между двумя значениями интерфейса.

Сравнение двух значений интерфейса фактически сравнивает их соответствующие динамические типы и динамические значения.

Этапы сравнения двух значений интерфейса (с \== оператором):

  1. Если одно из двух значений интерфейса является нулевым, то результатом сравнения становится ответ на вопрос, является ли другое значение интерфейса также нулевым.

  2. Если динамические типы двух значений интерфейса являются двумя разными типами, то результатом сравнения будет false.

  3. В случае, когда динамические типы двух значений интерфейса имеют один и тот же тип, если тот же динамический тип является несравнимым типом, произойдет паника. В противном случае результат сравнения является результатом сравнения динамических значений двух значений интерфейса.

Два значения интерфейса равны, только если выполняется одно из следующих условий.

  1. Они оба являются нулевыми значениями интерфейса.

  2. Их динамические типы идентичны и сопоставимы, а их динамические значения равны друг другу.

По правилам, два значения интерфейса, оба из которых являются динамическими значениями nil, могут не совпадать. Пример: