2014-09-27 106 views
1

GO可以通过名称,标记或接口等标准来查找结构体或函数吗?即沿着命令行任务/动词的行事?即:GO:查找/扫描结构体/函数

func cmd1() { 
    ... 
} 

func cmd2() { 
    ... 
} 

... 

func cmdN() { 
} 

func main() { 
    // Inspect os.Args and call cmd{X}() based on args. 
    ... 
} 

我不介意什么确切的机制,如果最终的目标是功能或结构 - 我们的目标是要得到的东西没有任何样板代码按照惯例工作。

+0

那让我想起http://stackoverflow.com/a/20823837/6309 – VonC 2014-09-27 15:51:42

+0

如果你把它变成对上面例子的最小答案,我会接受它。 – 2014-09-27 15:58:50

+0

当然,但在我的情况下,这些函数有一个结构作为接收器。 – VonC 2014-09-27 16:02:25

回答

1

您可以使用反射

package main 

import (
    "flag" 
    "fmt" 
    "reflect" 
) 

var cmd command 

type command struct{} 

func (c command) execute(name string) { 
    v := reflect.ValueOf(c) 

    cmd := v.MethodByName(name) 
    if !cmd.IsValid() { 
     fmt.Println(name + " not a command") 
     return 
    } 

    cmd.Call([]reflect.Value{}) 
} 

func (c command) Cmd1() { 
    fmt.Println("command 1") 
} 

func (c command) Cmd2() { 
    fmt.Println("command 2") 
} 

func (c command) Cmd3() { 
    fmt.Println("command 3") 
} 

func main() { 
    flag.Parse() 

    cmd.execute(flag.Arg(0)) 
} 

,或者您可以使用地图。

package main 

import (
    "flag" 
    "fmt" 
) 

func cmd1() { 
    fmt.Println("command 1") 
} 

func cmd2() { 
    fmt.Println("command 2") 
} 

func cmd3() { 
    fmt.Println("command 3") 
} 

var funcs = map[string]func(){ 
    "cmd1": cmd1, 
    "cmd2": cmd2, 
    "cmd3": cmd3, 
} 

func main() { 
    flag.Parse() 

    if f, ok := funcs[flag.Arg(0)]; ok { 
     f() 
    } else { 
     fmt.Println(flag.Arg(0) + " command not found") 
    } 
} 
+0

这个想法是得到一个习惯用语,而不必手动维护这样一个列表,在我的特定情况下,这个列表将增长到大约500个项目。 – 2014-09-27 15:56:27

+0

不幸的是,这是做到这一点的唯一方法。 – 2014-09-27 18:18:50

0

我用类似的方法在“How to test a collection of functions by reflection in Go?

的想法是列表,找到所有的功能需要,于我而言,有一定结构类型的功能:

stype := reflect.ValueOf(s) 
for _, fname := range funcNames { 
    sfunc := stype.MethodByName(fname) 
    // no parameter => empty slice of Value 
    ret := sfunc.Call([]reflect.Value{}) 
+0

对不起 - 刚刚意识到你的解决方案还需要预先了解方法。基本上这是不可行的去... https://groups.google.com/forum/#!topic/golang-nuts/M0ORoEU115o – 2014-09-27 18:16:43

+0

@AmirAbiri我同意 – VonC 2014-09-27 18:17:12