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

持久性 Reader() 对象

持久性 Reader() 对象

Go
Smart猫小萌 2022-07-25 10:55:03
在 Go 中,我试图创建一个函数来读取和处理下一行输入:// Read a string of hex from stdin and parse to an array of bytesfunc ReadHex() []byte {    r := bufio.NewReader(os.Stdin)    t, _ := r.ReadString('\n')    data, _ := hex.DecodeString(strings.TrimSpace(t))    return data}不幸的是,这只在第一次被调用时才有效。它捕获第一行,但无法捕获通过标准输入管道传输的后续行。我怀疑,如果在每个后续调用中都使用相同的持久 bufio.Reader() 对象,它会起作用,但如果不在每个函数调用上手动传递它,我就无法实现这一点。
查看完整描述

1 回答

?
12345678_0001

TA贡献1802条经验 获得超5个赞

是的,试试这个:

package main


import (

    "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 main


import (

    "bufio"

    "encoding/hex"

    "fmt"

    "io"

    "log"

    "os"

    "strings"

)


// InputReader struct

type InputReader struct {

    bufio.Reader

}


// New creates an InputReader

func 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 bytes

func (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())

}


查看完整回答
反对 回复 2022-07-25
  • 1 回答
  • 0 关注
  • 107 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号