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

在Go中,是否可以写入控制台并读回?,go,stdout,stdin,console-input,Go,Stdout,Stdin,Console Input,我正在为Go中的CLI编写向导。我想做的是询问用户想要做什么,准备适当的CLI命令,并将其写入控制台。然后,用户将通过按Enter键向CLI提交命令,可能是在首先编辑命令之后。换句话说,我想将输出写入stdout,当用户按Enter键时,它将成为stdin的输入。在Go中是否有这样做的方法?直接从用户处获取输入: var s string _, err := fmt.Scanf("%s", &s) 对于类似应用程序的诅咒,请查看以下内容: 它有C绑定。我发现了一个Go命令行编辑器包,

我正在为Go中的CLI编写向导。我想做的是询问用户想要做什么,准备适当的CLI命令,并将其写入控制台。然后,用户将通过按Enter键向CLI提交命令,可能是在首先编辑命令之后。换句话说,我想将输出写入stdout,当用户按Enter键时,它将成为stdin的输入。在Go中是否有这样做的方法?

直接从用户处获取输入:

var s string
_, err := fmt.Scanf("%s", &s)
对于类似应用程序的诅咒,请查看以下内容:


它有C绑定。

我发现了一个Go命令行编辑器包,它包含了所要求的功能和更多功能。它允许您编写具有历史记录和命令完成的CLI,命令完成功能正好提供了我在问题中要求的内容:它提供了用户可以编辑并提交到CLI的文本。它支持Windows、Linux和Mac。下面是该示例在自述文件中的一个稍加修改的版本,该版本运行一个简单的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()
    }
}

请查看,但不要在命令末尾发送“\n”。谢谢-这是一个很好的发现,接近我想要的。不幸的是,它依赖于操作系统(甚至不在Windows中编译)。而且,在Linux中,输出是混乱的(将命令打印两次)。不过,它很有前途,如果我能让它运行得令人满意,我会使用它并将其作为我自己问题的解决方案发布。但这不行——我想提供一种方法,直接从应用程序编写的文本接收用户输入到控制台。收集用户自己键入的内容很简单。我想做的是向控制台写入一些内容,并允许用户通过按Enter键将其提交回来。alvivi在上面的评论中建议的解决方案很接近,尽管它已经指出了问题。你是说像应用程序一样的诅咒?请查看我的更新中的curses库是否有用。