额外开启一个协程,循环获取输入,然后解析输入之后通过注册的cmdmap找到对应的callback进行调用。
命令与参数之间用空格分隔,如:
完整代码如下:
package ctl
import (
"bufio"
"errors"
"os"
"strings"
)
type cmdinfo struct {
cmd string
desc string
fn func(str string)
}
var cbmap map[string]*cmdinfo
func init() {
go run()
cbmap = make(map[string]*cmdinfo)
Register("test", "This is a test", func(arg string) {
println("Test callback of test command.")
})
Register("help", "Show all commands", func(arg string) {help()})
}
func Register(key string, desc string, fn func(string)) error {
if _, ok := cbmap[key];ok{
return errors.New("Repeat register cb of ctl:"+ key)
}
cbmap[key] = &cmdinfo{key, desc, fn}
return nil
}
func help(){
for key, cmd := range(cbmap) {
println("*\t", key, "\t\t ", cmd.desc)
}
}
func run() {
for {
input := bufio.NewScanner(os.Stdin)
input.Scan()
in := input.Text()
// 命令与参数之前用空格分隔
strs := strings.Split(in, " ")
cmd := strs[0]
arg := ""
if len(strs)==2{
arg = strs[1]
}
if cmd, ok := cbmap[cmd];ok{
cmd.fn(arg)
} else {
println("Invalid command, input ‘help’ to get more information.")
}
}
}
要注意协程安全!!
要注意协程安全!!
要注意协程安全!!
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。