从 golang 中的 stdin 读取

我正在尝试从 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

}

然而,似乎give_func_write从未达到过。我试图在 2 秒后启动一个 goroutine 来写入标准输入来测试这个。


我在这里缺少什么?也行r.Reset(r)。这在 go 中有效吗?我试图实现的只是从文件的开头重新开始读取。有没有更好的办法?


编辑


有玩绕后,我能够找到的代码是停留在a,_ := r.Read(bits)在read_exact功能


MM们
浏览 542回答 1
1回答

慕姐4208626

我想我需要有一个协议,在该协议中我发送一个 \n 以使输入工作,同时在阅读时丢弃它不,你没有。只有当它绑定到终端时,标准输入才会被行缓冲。您可以运行您的程序prog < /dev/zero或cat file | prog.bufio.NewWriter(os.Stdin).Write(p)您可能不想写入stdin. 有关详细信息,请参阅“写入标准输入和读取标准输出”。好吧,我不太清楚你想要达到的目标。我假设您只想从stdin固定大小的块中读取数据。为此使用io.ReadFull。或者,如果您想使用缓冲区,您可以使用Reader.Peek或Scanner来确保特定数量的字节可用。我已经更改了您的程序以演示以下用法io.ReadFull:package mainimport (&nbsp; &nbsp; "fmt"&nbsp; &nbsp; "io"&nbsp; &nbsp; "time")func main() {&nbsp; &nbsp; input, output := io.Pipe()&nbsp; &nbsp; go func() {&nbsp; &nbsp; &nbsp; &nbsp; defer output.Close()&nbsp; &nbsp; &nbsp; &nbsp; for _, m := range []byte("123456") {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; output.Write([]byte{m})&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; time.Sleep(time.Second)&nbsp; &nbsp; &nbsp; &nbsp; }&nbsp; &nbsp; }()&nbsp; &nbsp; message := make([]byte, 3)&nbsp; &nbsp; _, err := io.ReadFull(input, message)&nbsp; &nbsp; for err == nil {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Println(string(message))&nbsp; &nbsp; &nbsp; &nbsp; _, err = io.ReadFull(input, message)&nbsp; &nbsp; }&nbsp; &nbsp; if err != io.EOF {&nbsp; &nbsp; &nbsp; &nbsp; panic(err)&nbsp; &nbsp; }}您可以轻松地将其拆分为两个程序并以这种方式进行测试。只需更改input为os.Stdin.
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go