2015-10-08 1 views
1

Предположим, что у меня есть два пакета, какКак вызвать метод из другого пакета от имени метода строки в Go

-a

-b

есть некоторые методы, как это

func TestOne() { //something } 
func TestTwo() { //something } 

Мне нужно позвонить в пакет a методы из пакета b но только line метод name. Например, я получаю строку «TestOne» и вызывает метод TestOne(). Как я могу это сделать.

Редактировать: Я прочитал о reflect. но reflect нуждается в структуре и функциях , являющихся членами этой структуры. Что делать, если мои функции не являются членами структуры? просто простые методы в пакете. и вызывающие методы и вызываемые методы находятся в разных пакетах. Затем?

NB. Могут быть и некоторые методы, которые также имеют параметры.

+2

Связанные/возможно дубликат [Golang: указатель на функцию из строки (имя функции, в)] (http://stackoverflow.com/questions/18017979/golang-pointer-to-function -from-string-functions-name) – icza

+0

@icza Я прочитал этот вопрос и ответ. Но их решение, которое, по их словам, использовало, отражает. И отражают, что структура и функции являются членами этой структуры. Что делать, если мои функции не являются членами структуры? просто простые методы в пакете. и вызывающие методы и вызываемые методы находятся в разных пакетах. Затем? – sadlil

+0

Тогда ответ «нет», вы не можете этого сделать без чего-то вроде предварительно заполненной карты имен-функций, как видно из ответа @ LightWeight. – icza

ответ

0

Вы можете попробовать использовать рефлектор в go. Эта ссылка может помочь вам https://golang.org/pkg/reflect/ и http://mikespook.com/2012/07/function-call-by-name-in-golang/

func foo() { 
    // bla...bla...bla... 
} 
func bar(a, b, c int) { 
    // bla...bla...bla... 
} 
funcs := map[string]interface{}{"foo":foo, "bar":bar} 
+0

отражает, что структура и функции являются членами этой структуры.Что делать, если мои функции не являются членами структуры? просто простые методы в пакете. и вызывающие методы и вызываемые методы находятся в разных пакетах. Затем? – sadlil

2

Как Lightweight сказал в своем ответе, вы можете использовать отражение.

Вы используете метод reflect.ValueOf для получения значения типа. Затем вы можете использовать метод MethodByName для получения значения функции. Когда у вас есть значение функции, вы можете вызвать метод Call для его выполнения.

Пример кода

package main 

import (
    "fmt" 
    "reflect" 
) 

type TypeOne struct { 
} 

func (t *TypeOne) FuncOne() { 
    fmt.Println("FuncOne") 
} 

func (t *TypeOne) FuncTwo(name string) { 
    fmt.Println("Hello", name) 
} 

func CallFuncByName(myClass interface{}, funcName string, params ...interface{}) (out []reflect.Value, err error) { 
    myClassValue := reflect.ValueOf(myClass) 
    m := myClassValue.MethodByName(funcName) 
    if !m.IsValid() { 
     return make([]reflect.Value, 0), fmt.Errorf("Method not found \"%s\"", funcName) 
    } 
    in := make([]reflect.Value, len(params)) 
    for i, param := range params { 
     in[i] = reflect.ValueOf(param) 
    } 
    out = m.Call(in) 
    return 
} 

func main() { 
    t1 := &TypeOne{} 
    out, err := CallFuncByName(t1, "FuncOne") 
    if err != nil { 
     panic(err) 
    } 
    //Return value 
    _ = out 
    out, err = CallFuncByName(t1, "FuncTwo", "monkey") 
    if err != nil { 
     panic(err) 
    } 
    //Return value 
    _ = out 
} 
+0

отражает, что структура и функции являются членами этой структуры. Что делать, если мои функции не являются членами структуры? просто простые методы в пакете. и вызывающие методы и вызываемые методы находятся в разных пакетах. Затем? – sadlil

+0

Да, я идиот :) Я знал это, когда смотрел на него. Невозможно напрямую получить функции пакета. Вы можете создать карту всех функций, которые вы хотите вызвать. 'funcMap: = map [string] interface {} {" TestOne ": TestOne," TestTwo ": TestTwo}", а затем используйте 'reflect.ValueOf (funcMap [" TestOne "]). Call()' для его выполнения, как в Образец кода выше. –

+0

почему ты будешь идиотом, брат. Я тот, кто задает глупые вопросы. : P: P спасибо. Попытка того, что вы только что описали. – sadlil

Смежные вопросы