Как получить список методов структуры в Go? - PullRequest
0 голосов
/ 21 января 2020

У меня есть библиотека, в которой есть структуры Client и MockClient, которые реализуют один и тот же интерфейс ClientInterface. Я хотел бы написать модульные тесты, чтобы сохранить эти структуры в syn c, чтобы они не только реализовывали интерфейс, но и чтобы MockClient имел все методы Client. С этой целью я хотел бы получить список методов структуры, чтобы напечатать информационное сообщение об ошибке, если один из методов Client отсутствует в MockClient.

Я попытался адаптировать Как получить имя функции в Go? в этом упрощенном примере:

package main

import (
    "fmt"
    "reflect"
    "runtime"
)

type Person struct {
    Name string
}

func (person *Person) GetName() string {
    return person.Name
}

func main() {
    person := Person{Name: "John Doe"}
    personValue := reflect.ValueOf(&person)

    for i := 0; i < personValue.NumMethod(); i++ {
        fmt.Println(runtime.FuncForPC(personValue.Method(i).Pointer()).Name())
    }
}

Что мне нужно для этого сценария (общий доступ в https://play.golang.org/p/HwvhEPfWI5I ) для печати GetName. Однако вместо этого он печатает

reflect.methodValueCall

Как я могу заставить этот скрипт печатать имена методов *Person?

1 Ответ

1 голос
/ 21 января 2020

Используйте тип, чтобы получить имена методов:

t := reflect.TypeOf(&person)
for i := 0; i < t.NumMethod(); i++ {
    m := t.Method(i)
    fmt.Println(m.Name)
}

Запустите его на детской площадке .

...