Я смущен, почему это невозможно скомпилировать с помощью:
невозможное утверждение типа: Faz не реализует Foo (метод Bar имеет приемник указателей)
Если я сделаю приемник для Faz.Bar значением Faz, а не указателем Faz, тогда он компилируется отлично, но я думал, что всегда лучше иметь приемники указателей, чтобы значения не копировались вокруг?
package main
import (
    "log"
)
func main() {
    foo := New().(Faz)
    log.Println(foo)
}
type Foo interface {
    Bar() string
}
func New() Foo {
    return &Faz{}
}
type Faz struct {
}
func (f *Faz) Bar() string {
    return `Bar`
}