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

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

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

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

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

2 回答

?
largeQ

TA貢獻(xiàn)2039條經(jīng)驗(yàn) 獲得超8個(gè)贊

在 IRC 風(fēng)格的命令中,命令行通常如下所示:


/cmd [param1] [param2] ... [paramn]

當(dāng)收到這樣的命令時(shí),您可以使用拆分它strings.Split()來(lái)獲取命令的部分或令牌。這樣,您將擁有識(shí)別命令的第一個(gè)標(biāo)記。


您可以構(gòu)建一個(gè)map[string]Command映射,將文本命令映射到它們的Command結(jié)構(gòu)。在這張地圖中,您可以通過(guò)簡(jiǎn)單地索引地圖來(lái)獲取命令,例如:


cmdMap := make(map[string]Command)

// Populate map


textCmd := "/help"

cmd := cmdMap[textCmd]

如果你想有命令別名(例如,你想/help和/h和/?所有做相同的),您可以存儲(chǔ)別名每個(gè)命令的列表,當(dāng)你建立cmdMap,也為所有的別名,以點(diǎn)條目添加到相同的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"而"?"在這種情況下)來(lái)初始化您的地圖,它給你。


此外,您不必存儲(chǔ)函數(shù)的名稱,Go 中的函數(shù)是值,因此您可以在Command結(jié)構(gòu)中擁有一個(gè)函數(shù)字段,然后您無(wú)需反射即可調(diào)用該函數(shù)。例如:


func DoSomething() {

    fmt.Println("Doing something...")

}


var someFv = DoSomething


// And now you can do:

someFv()

請(qǐng)參閱Go 語(yǔ)言規(guī)范中的函數(shù)類型和函數(shù)文字。


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

TA貢獻(xiàn)1770條經(jīng)驗(yàn) 獲得超3個(gè)贊

首先,您不需要使用反射。您可以讓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 `.*`

}

然后您可以添加具有適當(dāng)簽名功能的命令:


cmd := Command{name: "foo",f: func(text string){fmt.Println(text)}}

它不必具有完全相同的簽名。您可以讓它接受連接或其他任何東西。您也不必內(nèi)聯(lián)函數(shù)定義,您可以引用任何您想要的具有適當(dāng)簽名的函數(shù)。


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

添加回答

舉報(bào)

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號(hào)

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