Какова роль синтаксиса "interface {}" в Go? - PullRequest
5 голосов
/ 09 февраля 2011

Я прочитал учебники Effective Go и Go, а также некоторые источники, но точный механизм синтаксиса interface {} - Go, для меня это несколько загадочно.Впервые я увидел это при попытке реализовать heap.Interface, и он, кажется, является каким-то контейнером (немного напоминающим мне монаду), из которого я могу извлечь значения произвольного типа.

Почему написан Goиспользовать это?Это какой-то обходной путь для дженериков?Есть ли более элегантный способ получить значения из heap.Interface, чем разыменование их с помощью heap.Pop(&h).(*Foo) (в случае указателей кучи для ввода Foo)?

Ответы [ 2 ]

7 голосов
/ 09 февраля 2011

interface{} - это универсальное поле, в котором может храниться все.Интерфейсы в go определяют набор методов, и любой тип, который реализует эти методы, соответствует интерфейсу.interface{} не определяет методы, и поэтому по определению каждый отдельный тип соответствует этому интерфейсу и, следовательно, может содержать значение типа interface{}.

Это на самом деле совсем не похоже на обобщение.Вместо этого это способ ослабить систему типов и сказать «здесь можно передать любое значение».Эквивалентом этой функции в Си является указатель void *, за исключением того, что в Go вы можете запросить тип удерживаемого значения.

1 голос
/ 28 февраля 2011

Вот отличное сообщение в блоге , которое объясняет, что происходит под капотом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...