Подтвердить что ты не робот

Поместите указатель на указатель интерфейса в Golang

У меня есть функция

func doStuff(inout *interface{}) {
   ...
}

целью этой функции является возможность обработки указателя любого типа в качестве входного. Но когда я хочу называть его указателем на структуру, у меня есть ошибка.

type MyStruct struct {
    f1 int
}

При вызове doStuff

ms := MyStruct{1}
doStuff(&ms)

У меня

test.go:38: cannot use &ms (type *MyStruct) as type **interface {} in argument to doStuff

Как я могу использовать &ms для совместимости с *interface{}?

4b9b3361

Ответ 1

Нет такой вещи, как "указатель на интерфейс" (технически вы можете использовать ее, но обычно она вам не нужна).

Как видно из "в чем смысл интерфейса {} в golang?", interface - это контейнер с двумя словами данных:

  • одно слово используется для указания таблицы методов для значений, лежащих в основе типа,
  • а другое слово используется для point для фактических данных, удерживаемых этим значением.

interface

Так что удалите указатель, а doStuff будет работать нормально: данные интерфейса будут &ms, ваш указатель:

func doStuff(inout interface{}) {
   ...
}

См. этот пример:

ms := MyStruct{1}
doStuff(&ms)
fmt.Printf("Hello, playground: %v\n", ms)

Вывод:

Hello, playground: {1}

Как newacct упоминает в комментариях:

Передача указателя на интерфейс напрямую работает, потому что если MyStruct соответствует протоколу, то *MyStruct также соответствует протоколу (так как набор методов типа включен в его набор методов типа указателя).

В этом случае интерфейс представляет собой пустой интерфейс, поэтому он принимает все типы в любом случае, но все же.