计划应该能够在终端上从stdin
获取输入,如下所示:
echo foobar | program
但是,在程序的下面的源代码中,如果省略管道,则stdin
读取阻止:
package main
import (
"fmt"
"os"
)
func main() {
b := make([]byte, 1024)
r := os.Stdin
n, e := r.Read(b)
if e != nil {
fmt.Printf("Err: %s\n", e)
}
fmt.Printf("Res: %s (%d)\n", b, n)
}
那么程序如何检测是否以这种方式通过管道传输某些内容,如果不是,则继续执行而不是阻止?
......这样做是个好主意吗?
答案 0 :(得分:1)
os.Stdin
被视为文件并具有权限。当os.Stdin
打开时,权限为0600
,关闭后0620
。
此代码有效:
package main
import (
"fmt"
"os"
)
func main() {
stat, _ := os.Stdin.Stat()
fmt.Printf("stdin mode: %v\n", stat.Mode().Perm())
if stat.Mode().Perm() == 0600 {
fmt.Printf("stdin open\n")
return
}
fmt.Printf("stdin close\n")
}
答案 1 :(得分:0)
如果你把读取放在goroutine中并使用select来从main中的通道进行非阻塞读取,那么你可能会有一个竞争条件,你可以根据数据是否得到不同的结果进来得很快。您尝试解决的问题是什么?