GO:查找/扫描结构/功能

时间:2014-09-27 15:23:51

标签: go

GO可以通过名称,标签或界面等标准查找结构或功能吗?即命令行任务/动词的内容?即:

func cmd1() {
    ...
}

func cmd2() {
    ...
}

...

func cmdN() {
}

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

我不介意确切的机制是什么,如果最终目标是函数或结构 - 目标是按惯例使某些东西工作而没有任何样板代码。

2 个答案:

答案 0 :(得分: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")
    }
}

答案 1 :(得分: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{})