Поскольку переменная типа 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 с небольшим исключением, что оба могут использоваться для обработки всего, где вас не волнует реальная его природа.