Как вызвать метод по строковой переменной? - PullRequest
1 голос
/ 05 мая 2020

Я видел это здесь раньше. Но я не понимаю ответов.

Как мне вызвать метод из строкового значения. Итак, если

у меня есть много методов, которые имеют

func (c *something) whateverName(whatever map[string]interface{}) {
}

одинаковый тип аргумента в каждом из них. no return et c ... Буквально единственная разница в имени метода.

Я хочу сделать что-то вроде этого, и я просто не могу заставить его работать. Я просто хочу вызвать правильный метод из значения "var myMethod string":

func (c something) foo(m map[string]interface{}) {
 fmt.Println("foo..")
 //do something with m
}

func main() {
 myMethod := "foo"
 message := make(map[string]interface{})
 //fill message with stuff...
 c := something{} //this is just a hypothetical example...
 vt := reflect.ValueOf(c)
 vm := vt.MethodByName(myMethod)    
 vm.Call([]reflect.Value{reflect.ValueOf(message)})
}

Я, очевидно, не понимаю, как работает отражение.

1 Ответ

4 голосов
/ 05 мая 2020

Ваш пример работает, если вы экспортируете метод. Измените foo на Foo:

type something struct{}

func (c something) Foo(m map[string]interface{}) {
    fmt.Println("Foo..")
    //do something with m
}

func main() {
    myMethod := "Foo"
    message := make(map[string]interface{})
    //fill message with stuff...
    c := something{} //this is just a hypothetical example...
    vt := reflect.ValueOf(c)
    vm := vt.MethodByName(myMethod)
    vm.Call([]reflect.Value{reflect.ValueOf(message)})
}

Это будет выводить (попробуйте на Go Playground ):

Foo..

Также обратите внимание, что в этом примере Foo() имеет значение получателя: c something. Если у метода есть приемник указателя, такой как c *something, вам необходимо иметь значение указателя для начала, потому что метод с приемником указателя не входит в набор методов типа без указателя.

См. Также: Функции вызова со специальным префиксом / суффиксом

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...