2 回答

TA貢獻2039條經(jīng)驗 獲得超8個贊
在 IRC 風(fēng)格的命令中,命令行通常如下所示:
/cmd [param1] [param2] ... [paramn]
當收到這樣的命令時,您可以使用拆分它strings.Split()來獲取命令的部分或令牌。這樣,您將擁有識別命令的第一個標記。
您可以構(gòu)建一個map[string]Command映射,將文本命令映射到它們的Command結(jié)構(gòu)。在這張地圖中,您可以通過簡單地索引地圖來獲取命令,例如:
cmdMap := make(map[string]Command)
// Populate map
textCmd := "/help"
cmd := cmdMap[textCmd]
如果你想有命令別名(例如,你想/help和/h和/?所有做相同的),您可以存儲別名每個命令的列表,當你建立cmdMap,也為所有的別名,以點條目添加到相同的Command結(jié)構(gòu),在這種情況下,您應(yīng)該像這樣定義它:
cmdMap := make(map[string]*Command)
helpCmd := &Command{...} // Create help command
cmdMap["/help"] = helpCmd
cmdMap["/h"] = helpCmd
cmdMap["/?"] = helpCmd
注意:你也可以去掉領(lǐng)先斜線'/',只需使用該命令的其余部分("help","h"而"?"在這種情況下)來初始化您的地圖,它給你。
此外,您不必存儲函數(shù)的名稱,Go 中的函數(shù)是值,因此您可以在Command結(jié)構(gòu)中擁有一個函數(shù)字段,然后您無需反射即可調(diào)用該函數(shù)。例如:
func DoSomething() {
fmt.Println("Doing something...")
}
var someFv = DoSomething
// And now you can do:
someFv()
請參閱Go 語言規(guī)范中的函數(shù)類型和函數(shù)文字。

TA貢獻1770條經(jīng)驗 獲得超3個贊
首先,您不需要使用反射。您可以讓Command結(jié)構(gòu)包含具有 func 類型的成員。
type Command struct {
name string // the name of the command
f func(string) // the function that will be called upon match
help string // the help message for the command
regex regexp.Regexp // the regex pattern that will run the command
}
func processMessage(text string){
for _,cmd := range(allCmds){
if cmd.regex.MatchString(text){
cmd.f(text)
return
}
}
defaultAction(text) //or just add a catch-all with a regex of `.*`
}
然后您可以添加具有適當簽名功能的命令:
cmd := Command{name: "foo",f: func(text string){fmt.Println(text)}}
它不必具有完全相同的簽名。您可以讓它接受連接或其他任何東西。您也不必內(nèi)聯(lián)函數(shù)定義,您可以引用任何您想要的具有適當簽名的函數(shù)。
- 2 回答
- 0 關(guān)注
- 240 瀏覽
添加回答
舉報