2014-09-27 105 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