Is Go интерфейс {} такой же, как void * в C?

Поскольку переменная типа interface{} может иметь любое значение, означает ли это, что это по существу общий указатель, такой как void * в C?

Ответ 1

В то время как C void * указатели и переменные Go interface{} совместно используют свойство, которое вы можете хранить произвольные типы, существует одна большая разница: переменные интерфейса Go также сохраняют тип значения, которое они хранят.

Поэтому, когда программист C должен следить за тем, чтобы любые нажатия от void * указателей на определенные типы были безопасными, среда выполнения Go может проверить правильность утверждений любого типа.

Информация о типе, найденная в интерфейсных переменных, также допускает сложную интроспекцию времени выполнения через пакет reflect, что было бы невозможно с помощью простого указателя void *.

Ответ 2

Я склонен сказать "Совсем нет!". Но я признаю, что это может служить той же целью: "держать все, что приходит".

  • interface {} не является указателем, поэтому вы не можете его разыменовать.
  • Вы можете применить void* к чему угодно, но тип assert interface {} может привести к панике в процессе выполнения.
  • Сложно (или невозможно) определить фактический тип a void*, но пакетное отражение позволяет сделать это для interface {}.

Так нет! interface {} является пустым интерфейсом и не имеет ничего общего с void* в C с небольшим исключением, что оба могут использоваться для обработки всего, где вас не волнует реальная его природа.