Ответ 1
Нет такой вещи, как "указатель на интерфейс" (технически вы можете использовать ее, но обычно она вам не нужна).
Как видно из "в чем смысл интерфейса {} в golang?", interface
- это контейнер с двумя словами данных:
- одно слово используется для указания таблицы методов для значений, лежащих в основе типа,
- а другое слово используется для point для фактических данных, удерживаемых этим значением.
Так что удалите указатель, а doStuff
будет работать нормально: данные интерфейса будут &ms
, ваш указатель:
func doStuff(inout interface{}) {
...
}
См. этот пример:
ms := MyStruct{1}
doStuff(&ms)
fmt.Printf("Hello, playground: %v\n", ms)
Вывод:
Hello, playground: {1}
Как newacct упоминает в комментариях:
Передача указателя на интерфейс напрямую работает, потому что если
MyStruct
соответствует протоколу, то*MyStruct
также соответствует протоколу (так как набор методов типа включен в его набор методов типа указателя).В этом случае интерфейс представляет собой пустой интерфейс, поэтому он принимает все типы в любом случае, но все же.