gpt4 book ai didi

go - 当 stdin 是别的东西时,Go 程序可以从键盘读取吗?

转载 作者:IT王子 更新时间:2023-10-29 02:30:08 25 4
gpt4 key购买 nike

我有一个通过管道接受输入的 Go 进程。

tail -f something.foo | go run myprog.go

由于 stdin 是管道的输出,我无法在 myprog.go 中找到读取键盘输入的方法。这可能吗?

我考虑过在 myprog.go 中执行 tail 命令,但我想避免在 myprog.go 崩溃并且无法终止另一个进程时创建另一个进程。

最佳答案

在 linux(和一般的 POSIX)上,您可以打开 /dev/tty 来为您的进程获取控制 tty 的输入。

func readStdin() {
buf := make([]byte, 1024)
for {
n, err := os.Stdin.Read(buf)
if err != nil && err != io.EOF {
log.Fatal(err)
}
fmt.Print("FROM STDIN:", string(buf[:n]))
if err == io.EOF {
return
}
}
}

func main() {
go readStdin()

buf := make([]byte, 1024)
tty, err := os.Open("/dev/tty")
if err != nil {
log.Fatal(err)
}
defer tty.Close()
for {
n, err := tty.Read(buf)
if err != nil && err != io.EOF {
log.Fatal(err)
}
fmt.Print("FROM TTY:", string(buf[:n]))
if err == io.EOF {
return
}
}
}

哪个可以输出:

$ echo HELLO | ./tty_reader
FROM STDIN:HELLO
typing on my keyboard
FROM TTY:typing on my keyboard

关于go - 当 stdin 是别的东西时,Go 程序可以从键盘读取吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29418868/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com