在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[1D 33[K")
continue
}
rs = append(rs, r)
}
raw(false)
}