第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

我正在編寫一個具有 irc 樣式命令的聊天應(yīng)用程序。構(gòu)建程序以處理這些命令的最佳方法是什么?

我正在編寫一個具有 irc 樣式命令的聊天應(yīng)用程序。構(gòu)建程序以處理這些命令的最佳方法是什么?

Go
慕桂英3389331 2021-09-27 17:42:52
我正在編寫本質(zhì)上是一個聊天程序。我想在其中包含一些特殊的 irc 樣式命令,但我似乎無法概念化如何構(gòu)建程序。我想知道人們是否可以從高層次的角度幫助我。我不是在尋找代碼,只是關(guān)于如何最好地進行的想法。我最好的嘗試是有一個像下面這樣的命令結(jié)構(gòu):type Command struct {  name     string // the name of the command  function string // the function that will be called upon match  help     string // the help message for the command  regex    string // the regex pattern that will run the command}然后有一個命令片段,每次我收到來自客戶端的消息時就迭代它。如果接收到的數(shù)據(jù)與正則表達式匹配,那么反射(我認為這會起作用)包調(diào)用“函數(shù)”。出于某種原因,我覺得必須有更好的方法。我正在學(xué)習(xí)自己編寫 Go 代碼,并且沒有可用的資源來激發(fā)靈感。我非常感謝您對此的想法。
查看完整描述

2 回答

?
largeQ

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ù)文字。


查看完整回答
反對 回復(fù) 2021-09-27
?
德瑪西亞99

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ù)。


查看完整回答
反對 回復(fù) 2021-09-27
  • 2 回答
  • 0 關(guān)注
  • 240 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號