持久性 Reader() 对象

在 Go 中,我试图创建一个函数来读取和处理下一行输入:


// Read a string of hex from stdin and parse to an array of bytes

func ReadHex() []byte {

    r := bufio.NewReader(os.Stdin)

    t, _ := r.ReadString('\n')

    data, _ := hex.DecodeString(strings.TrimSpace(t))

    return data

}

不幸的是,这只在第一次被调用时才有效。它捕获第一行,但无法捕获通过标准输入管道传输的后续行。


我怀疑,如果在每个后续调用中都使用相同的持久 bufio.Reader() 对象,它会起作用,但如果不在每个函数调用上手动传递它,我就无法实现这一点。


Smart猫小萌
浏览 108回答 1
1回答

12345678_0001

是的,试试这个:package mainimport (    "bufio"    "encoding/hex"    "fmt"    "log"    "os"    "strings")func ReadFunc() func() []byte {    r := bufio.NewReader(os.Stdin)    return func() []byte {        t, err := r.ReadString('\n')        if err != nil {            log.Fatal(err)        }        data, err := hex.DecodeString(strings.TrimSpace(t))        if err != nil {            log.Fatal(err)        }        return data    }}func main() {    r, w, err := os.Pipe()    if err != nil {        log.Fatal(err)    }    os.Stdin = r    w.Write([]byte(`ffff    cafebabe    ff    `))    w.Close()    ReadHex := ReadFunc()    fmt.Println(ReadHex())    fmt.Println(ReadHex())    fmt.Println(ReadHex())}输出:[255 255][202 254 186 190][255]使用 a struct,试试这个:package mainimport (    "bufio"    "encoding/hex"    "fmt"    "io"    "log"    "os"    "strings")// InputReader structtype InputReader struct {    bufio.Reader}// New creates an InputReaderfunc New(rd io.Reader) *InputReader {    return &InputReader{Reader: *bufio.NewReader(rd)}}// ReadHex returns a string of hex from stdin and parse to an array of bytesfunc (r *InputReader) ReadHex() []byte {    t, err := r.ReadString('\n')    if err != nil {        log.Fatal(err)    }    data, err := hex.DecodeString(strings.TrimSpace(t))    if err != nil {        log.Fatal(err)    }    return data}func main() {    r, w, err := os.Pipe()    if err != nil {        log.Fatal(err)    }    os.Stdin = r    w.Write([]byte(`ffff    cafebabe    ff    `))    w.Close()    rdr := New(os.Stdin)    fmt.Println(rdr.ReadHex())    fmt.Println(rdr.ReadHex())    fmt.Println(rdr.ReadHex())}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go