String 持久读取器()对象
在Go中,我试图创建一个函数来读取和处理下一行输入: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
// 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())
}