英文:
Determine if Stdin has data with Go
问题
有没有办法检查输入流(os.Stdin
)是否有数据?
这篇帖子https://stackoverflow.com/questions/12363030/read-from-initial-stdin-in-go/12384207展示了如何读取数据,但是如果没有数据输入到stdin中,它会阻塞。
英文:
Is there a way to check if the input stream (os.Stdin
) has data?
The post https://stackoverflow.com/questions/12363030/read-from-initial-stdin-in-go/12384207 shows how to read the data, but unfortunately blocks if no data is piped into the stdin.
答案1
得分: 16
os.Stdin就像任何其他的“文件”,所以你可以检查它的大小:
package main
import (
"fmt"
"os"
)
func main() {
file := os.Stdin
fi, err := file.Stat()
if err != nil {
fmt.Println("file.Stat()", err)
}
size := fi.Size()
if size > 0 {
fmt.Printf("%v bytes available in Stdin\n", size)
} else {
fmt.Println("Stdin is empty")
}
}
我将其构建为一个“管道”可执行文件,以下是它的工作原理:
$ ./pipe
Stdin is empty
$ echo test | ./pipe
5 bytes available in Stdin
英文:
os.Stdin is like any other "file", so you can check it's size:
package main
import (
"fmt"
"os"
)
func main() {
file := os.Stdin
fi, err := file.Stat()
if err != nil {
fmt.Println("file.Stat()", err)
}
size := fi.Size()
if size > 0 {
fmt.Printf("%v bytes available in Stdin\n", size)
} else {
fmt.Println("Stdin is empty")
}
}
I built this as a "pipe" executable, here is how it works:
$ ./pipe
Stdin is empty
$ echo test | ./pipe
5 bytes available in Stdin
答案2
得分: 8
这似乎是一个可靠的解决方案,即使通过管道传递了延迟的数据,也可以正常工作。
package main
import (
"os"
"fmt"
)
func main() {
fi, err := os.Stdin.Stat()
if err != nil {
panic(err)
}
if fi.Mode() & os.ModeNamedPipe == 0 {
fmt.Println("没有管道 :(")
} else {
fmt.Println("有管道!")
}
}
你可以在这个链接中找到更多关于这个解决方案的信息:https://coderwall.com/p/zyxyeg/golang-having-fun-with-os-stdin-and-shell-pipes
英文:
This seems to be reliable solution and works even with sleep/delayed data via pipe.
https://coderwall.com/p/zyxyeg/golang-having-fun-with-os-stdin-and-shell-pipes
package main
import (
"os"
"fmt"
)
func main() {
fi, err := os.Stdin.Stat()
if err != nil {
panic(err)
}
if fi.Mode() & os.ModeNamedPipe == 0 {
fmt.Println("no pipe :(")
} else {
fmt.Println("hi pipe!")
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论