在golang读取stdin

Bul*_*ula 2 go

我正试图在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函数中

ale*_*asi 7

我想我需要一个协议,我发送一个\n来使输入工作,同时在阅读时将其丢弃

不,你没有.Stdin只有在绑定到终端时才会进行行缓冲.你可以运行你的程序prog < /dev/zerocat file | prog.

bufio.NewWriter(os.Stdin).WRITE(p)的

你可能不想写信给stdin.有关详细信息,请参阅" 写入stdin并从stdout读取 ".

嗯,对我来说,你想要达到的目标并不是特别清楚.我假设,您只想stdin通过固定大小的块读取数据.使用io.ReadFull.或者,如果要使用缓冲区,可以使用Reader.PeakScanner来确保可用的特定字节数.我已经改变你的程序来演示以下用法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.