为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中,是否可以写入控制台并回读?

在 Go 中,是否可以写入控制台并回读?

Go
拉莫斯之舞 2021-10-18 14:16:38
我正在为 Go 中的 CLI 编写向导。我想做的是询问用户他想做什么,准备适当的 CLI 命令,并将其写入控制台。然后,用户可以通过按 Enter 将命令提交到 CLI,可能是在先对其进行编辑之后。换句话说,我想将输出写入标准输出,当用户按下 Enter 时,该输出成为标准输入的输入。有没有办法在 Go 中做到这一点?
查看完整描述

2 回答

?
牧羊人nacy

TA贡献1862条经验 获得超7个赞

我找到了一个 Go 命令行编辑器包https://github.com/peterh/liner,它包含了请求的功能和更多功能。它允许您编写具有历史记录和命令完成功能的 CLI,命令完成功能提供了我在问题中所要求的内容:它显示了用户可以编辑并提交给 CLI 的文本。它支持 Windows、Linux 和 Mac。这是 README 中示例的稍微修改版本,它运行带有命令完成功能的简单 CLI。例如,用户可以键入“j”并按 Tab 键循环浏览名称列表,编辑一个来品尝,然后按 Enter 提交。


package main


import (

    "fmt"

    "log"

    "os"

    "strings"


    "github.com/peterh/liner"

)


var (

    history_fn = ".liner_history"

    names      = []string{"jack", "john", "james", "mary", "mike", "nancy"}

)


func main() {

    line := liner.NewLiner()

    defer line.Close()


    line.SetCompleter(func(line string) (c []string) {

        for _, n := range names {

            if strings.HasPrefix(n, strings.ToLower(line)) {

                c = append(c, n)

            }

        }

        return

    })


    if f, err := os.Open(history_fn); err == nil {

        line.ReadHistory(f)

        f.Close()

    }


    line.SetCtrlCAborts(true)

    for true {

        if name, err := line.Prompt("What is your name? "); err != nil {

            if err.Error() == "EOF" || err == liner.ErrPromptAborted {

                break

            }

            log.Print("Error reading line: ", err)

        } else {

            log.Print("Got: ", name)

            line.AppendHistory(name)

        }

    }

    fmt.Printf("End of test\n")


    if f, err := os.Create(history_fn); err != nil {

        log.Print("Error writing history file: ", err)

    } else {

        line.WriteHistory(f)

        f.Close()

    }

}


查看完整回答
反对 回复 2021-10-18
  • 2 回答
  • 0 关注
  • 158 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信