Поскольку переменная типа interface{}
может иметь любое значение, означает ли это, что это по существу общий указатель, такой как void * в C?
Is Go интерфейс {} такой же, как void * в C?
Ответ 1
В то время как C void *
указатели и переменные Go interface{}
совместно используют свойство, которое вы можете хранить произвольные типы, существует одна большая разница: переменные интерфейса Go также сохраняют тип значения, которое они хранят.
Поэтому, когда программист C должен следить за тем, чтобы любые нажатия от void *
указателей на определенные типы были безопасными, среда выполнения Go может проверить правильность утверждений любого типа.
Информация о типе, найденная в интерфейсных переменных, также допускает сложную интроспекцию времени выполнения через пакет reflect
, что было бы невозможно с помощью простого указателя void *
.
Ответ 2
Я склонен сказать "Совсем нет!". Но я признаю, что это может служить той же целью: "держать все, что приходит".
-
interface {}
не является указателем, поэтому вы не можете его разыменовать. - Вы можете применить
void*
к чему угодно, но тип assertinterface {}
может привести к панике в процессе выполнения. - Сложно (или невозможно) определить фактический тип a
void*
, но пакетное отражение позволяет сделать это дляinterface {}
.
Так нет! interface {}
является пустым интерфейсом и не имеет ничего общего с void*
в C с небольшим исключением, что оба могут использоваться для обработки всего, где вас не волнует реальная его природа.