为了账号安全,请及时绑定邮箱和手机立即绑定

从 golang 中的 stdin 读取

从 golang 中的 stdin 读取

Go
MM们 2021-09-21 16:59:49
我正在尝试从 Golang 中的 Stdin 读取数据,因为我正在尝试为 Erlang 实现一个驱动程序。我有以下代码:package mainimport (    "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功能
查看完整描述

1 回答

?
慕姐4208626

TA贡献1852条经验 获得超7个赞

我想我需要有一个协议,在该协议中我发送一个 \n 以使输入工作,同时在阅读时丢弃它


不,你没有。只有当它绑定到终端时,标准输入才会被行缓冲。您可以运行您的程序prog < /dev/zero或cat file | prog.


bufio.NewWriter(os.Stdin).Write(p)


您可能不想写入stdin. 有关详细信息,请参阅“写入标准输入和读取标准输出”。


好吧,我不太清楚你想要达到的目标。我假设您只想从stdin固定大小的块中读取数据。为此使用io.ReadFull。或者,如果您想使用缓冲区,您可以使用Reader.Peek或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)

    }

}

您可以轻松地将其拆分为两个程序并以这种方式进行测试。只需更改input为os.Stdin.


查看完整回答
反对 回复 2021-09-21
  • 1 回答
  • 0 关注
  • 540 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信