В Go, если у нас есть тип
type Foo_impl struct {}
Мы обычно используем
func NewFoo_impl() *Foo_impl
для создания этого экземпляра этой структуры (при необходимости)
Нет экземпляра интерфейса, мы просто говорим, что тип реализует интерфейс или нет.
Таким образом, ваш код может быть
var x Foo
x = NewFoo_impl()
// or x = &Foo_impl{}
Что касается косвенного типа интерфейса, его нетрудно понять, зная его точно так же, как void*
в C.
Разыменование не возвращает тип, который вам нужен, фактически компилятор также не знает, как с ним обращаться. Это стало неполным типом, таким образом, решение Го запрещает это.