我正试图在Golang中读取Stdin,因为我正在尝试为Erlang实现驱动程序.我有以下代码:
package main
import (
"fmt"
"os"
"bufio"
"time"
)
func main() {
go func() {
stdout := bufio.NewWriter(os.Stdin)
p := []byte{121,100,125,'\n'}
stdout.Write(p)
}()
stdin := bufio.NewReader(os.Stdin)
values := make([]byte,4,4)
for{
fmt.Println("b")
if read_exact(stdin) > 0 {
stdin.Read(values)
fmt.Println("a")
give_func_write(values)
}else{
continue
}
}
}
func read_exact(r *bufio.Reader) int {
bits := make([]byte,3,3)
a,_ := r.Read(bits)
if a > 0 {
r.Reset(r)
return 1
}
return -1
}
func give_func_write(a []byte) bool {
fmt.Println("Yahu")
return true
}
Run Code Online (Sandbox Code Playgroud)
然而,似乎give_func_write从未达到过.我尝试在2秒后启动goroutine写入标准输入来测试它.
我在这里错过了什么?也行r.Reset(r).这有效吗?我试图实现的只是从文件的开头重新开始读取.有没有更好的办法?
编辑
玩完之后,我发现代码卡a,_ := r.Read(bits)在了read_exact函数中
我想我需要一个协议,我发送一个\n来使输入工作,同时在阅读时将其丢弃
不,你没有.Stdin只有在绑定到终端时才会进行行缓冲.你可以运行你的程序prog < /dev/zero或cat file | prog.
bufio.NewWriter(os.Stdin).WRITE(p)的
你可能不想写信给stdin.有关详细信息,请参阅" 写入stdin并从stdout读取 ".
嗯,对我来说,你想要达到的目标并不是特别清楚.我假设,您只想stdin通过固定大小的块读取数据.使用io.ReadFull.或者,如果要使用缓冲区,可以使用Reader.Peak或Scanner来确保可用的特定字节数.我已经改变你的程序来演示以下用法io.ReadFull:
package main
import (
"fmt"
"io"
"time"
)
func main() {
input, output := io.Pipe()
go func() {
defer output.Close()
for _, m := range []byte("123456") {
output.Write([]byte{m})
time.Sleep(time.Second)
}
}()
message := make([]byte, 3)
_, err := io.ReadFull(input, message)
for err == nil {
fmt.Println(string(message))
_, err = io.ReadFull(input, message)
}
if err != io.EOF {
panic(err)
}
}
Run Code Online (Sandbox Code Playgroud)
您可以轻松地将其拆分为两个程序并以这种方式进行测试.只需input改为os.Stdin.
| 归档时间: |
|
| 查看次数: |
12747 次 |
| 最近记录: |