Как сбрасывать методы структур в Голанге?

Пакет "fmt" Golang имеет метод дампа Printf("%+v", anyStruct).

Я ищу любой метод, чтобы сбрасывать структуру, также сбрасывая свои методы. таких как

type Foo struct {
    Prop string
}
func (f Foo)Bar() string {
    return f.Prop
}

Я хочу проверить (не только свойства) существование метода "Бар" в инициализированном экземпляре типа "Foo".

Есть ли хороший способ сделать это?

Ответ 1

Вы можете перечислить методы типа с помощью пакета reflect. Например:

fooType := reflect.TypeOf(Foo{})
for i := 0; i < fooType.NumMethod(); i++ {
    method := fooType.Method(i)
    fmt.Println(method.Name)
}

Вы можете поиграть с этим здесь: http://play.golang.org/p/wNuwVJM6vr

С учетом этого, если вы хотите проверить, реализует ли тип определенный набор методов, вам может быть проще использовать интерфейсы и утверждение типа. Например:

func implementsBar(v interface{}) bool {
    type Barer interface {
        Bar() string
    }
    _, ok := v.(Barer)
    return ok
}

...
fmt.Println("Foo implements the Bar method:", implementsBar(Foo{}))

Или, если вы просто хотите, что составляет утверждение времени компиляции, что определенный тип имеет методы, вы можете просто включить следующее:

var _ Barer = Foo{}