【问题标题】:Persistent Reader() object持久性 Reader() 对象
【发布时间】:2021-04-05 11:52:11
【问题描述】:

在 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() 对象,它会起作用,但如果不在每个函数调用中手动传递它,我就无法实现这一点。

【问题讨论】:

  • 闭包在这里有什么帮助?如果您有一个包含阅读器的结构,并使用 ReadHex 作为方法,则可能会更容易。
  • 我会试试的 - 谢谢
  • @BurakSerdar 接受的答案显示了如何使用闭包 - 我只是无法让它工作。

标签: string go closures


【解决方案1】:
  1. 是的,试试this:
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]

  1. 使用struct,试试this:
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())
}

【讨论】:

    猜你喜欢
    • 2011-12-25
    • 2011-01-23
    • 2011-05-25
    • 2013-06-04
    • 2010-12-26
    • 2011-05-30
    • 2010-11-05
    • 2021-11-07
    相关资源
    最近更新 更多