猿问

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

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


拉莫斯之舞
浏览 159回答 2
2回答

牧羊人nacy

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

相关分类

Go
我要回答