Ответ 1
Когда у вас есть структура, реализующая интерфейс, указатель на эту структуру автоматически реализует этот интерфейс. Вот почему у вас никогда не было *SomeInterface
в прототипе функций, поскольку это ничего не добавит к SomeInterface
, и вам не нужен такой тип в объявлении переменной (см. этот связанный вопрос).
Значение интерфейса не является значением конкретной структуры (поскольку оно имеет размер переменной, это было бы невозможно), но это своего рода указатель (точнее указатель на структуру и указатель к типу). Russ Cox описывает это как здесь:
Значения интерфейса представляются в виде пары из двух слов, указывающей указатель к информации о типе, хранящемся в интерфейсе, и указателе на связанные данные.
Вот почему Interface
, а не *Interface
- правильный тип, чтобы удерживать указатель на реализацию структуры Interface
.
Поэтому вы должны просто использовать
var pi Interface