Golang - 读取 Os.stdin 输入,但不要回显它



在Golang程序中,我正在读取Bufio.Reader的OS.STDIN输入。

按下Enter后,程序将读取输入,然后将其打印到控制台上。是否可以不将输入打印到控制台上?阅读后,我对输入进行处理并重印(并且不再需要原始输入)。

我读了这样的数据:

inputReader := bufio.NewReader(os.Stdin)
for {
    outgoing, _ := inputReader.ReadString('n')
    outs <- outgoing
}

我无法考虑其他方法,而不是使用ANSI逃生代码清除终端并将光标移至特定位置(在您的情况下,第1列:第1列)。

var screen *bytes.Buffer = new(bytes.Buffer)
var output *bufio.Writer = bufio.NewWriter(os.Stdout)

这是一些基本的助手方法,可以减轻与终端一起工作的工作。

// Move cursor to given position
func moveCursor(x int, y int) {
    fmt.Fprintf(screen, "33[%d;%dH", x, y)
}
// Clear the terminal
func clearTerminal() {
    output.WriteString("33[2J")
}

然后在您的功能内部,您需要清除终端并将光标移至终端窗口的第一列和第一行。最后,您必须输出计算的结果。

for {
    outgoing, err := input.ReadString('n')
    if err != nil {
        break
    }
    if _, err := fmt.Sscanf(outgoing, "%f", input); err != nil {
        fmt.Println("Input error!")
        continue
    }
    // Clear console
    clearTerminal()
    moveCursor(1,1)
    fmt.Println(outs) // prints the computed result
}

看来,您正在寻找禁用ECHO的终端特定函数。通常在终端上写密码时使用(您可以输入但看不到字符)。

我建议您尝试终端。阅读通行字,它应该以最跨平台兼容的方式工作。

prompt := ""
t := terminal.NewTerminal(os.Stdin, prompt)
for {
    outgoing, err := t.ReadPassword(prompt)
    if err != nil {
        log.Fatalln(err)
    }
    outs <- outgoing
}

除了加密/ssh/terminal;

package main
import (
    "bufio"
    "fmt"
    "os"
    "os/exec"
)
func raw(start bool) error {
    r := "raw"
    if !start {
        r = "-raw"
    }
    rawMode := exec.Command("stty", r)
    rawMode.Stdin = os.Stdin
    err := rawMode.Run()
    if err != nil {
        return err
    }
    return rawMode.Wait()
}
// http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x361.html
func main() {
    var rs []rune
    raw(true)
    for {
        inp := bufio.NewReader(os.Stdin)
        r, _, err := inp.ReadRune()
        if err != nil {
            raw(false)
            panic(err)
        }
        if r == 'x03' { // ctrl+c
            break
        } else if r == 'r' { // enter
            fmt.Print(string(rs), "nr")
            rs = []rune{}
            continue
        } else if r == 'u007f' { // backspace
            fmt.Printf("33[1D33[K")
            continue
        }
        rs = append(rs, r)
    }
    raw(false)
}

最新更新