前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >分享一个GO 辅助命令行

分享一个GO 辅助命令行

原创
作者头像
IT工作者
发布2022-07-21 17:58:51
1450
发布2022-07-21 17:58:51
举报
文章被收录于专栏:程序技术知识程序技术知识

额外开启一个协程,循环获取输入,然后解析输入之后通过注册的cmdmap找到对应的callback进行调用。

命令与参数之间用空格分隔,如:

完整代码如下:

代码语言:go
复制
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 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档