Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 持久读取器()对象_String_Go_Closures - Fatal编程技术网

String 持久读取器()对象

String 持久读取器()对象,string,go,closures,String,Go,Closures,在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 da

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

  • 是的,试试:
  • 输出:

    [255 255]
    [202 254 186 190]
    [255]
    

  • 使用
    结构
    ,尝试:

  • 闭包有什么用?如果你有一个包含读卡器的结构,用ReadHex作为一个方法,可能会更容易。我会试试看-谢谢you@BurakSerdar被接受的答案显示了如何使用闭包-我就是无法让它工作。非常感谢
    [255 255]
    [202 254 186 190]
    [255]
    
    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())
    }