我有下一个代码:
func Decompress(input []byte, ctx context.Context) (jsonMap map[string]string) {
dataReaders := SplitDataByPreamble(input)
jsonMap = map[string]string{}
for _, reader := range dataReaders {
select {
case <-ctx.Done():
{
log.Println(ctx.Err())
return jsonMap
}
default:
{
key := GetKey(&reader)
keyString := string(key)
var value string
f, ok := keyAndStrangeValues[keyString]
if ok {
value = f(&reader)
} else {
value = parseString(&reader)
}
jsonMap[keyString] = value
}
}
}
return
}
和下一个功能:
func SplitDataByPreamble(input []byte) (readers []bytes.Reader) {
m := regexp.MustCompile(string(input[0:2]) + "." + string(input[3:4]))
foundData := m.FindAll(input, -1)
if len(foundData) <= 0 {
log.Fatalln("Cannot split data!")
}
for _, data := range foundData {
r := bytes.NewReader(data)
readers = append(readers, r)
}
return
}
在最后一个函数中,我想返回一片bytes.Reader。但下一个函数返回 io.Reader
r := bytes.NewReader(data)
导致第一个代码中的情况出现错误。如何将 io.reader 转换为 bytes.reader?
io.Reader 是一个接口,将 io.Reader 转换为 bytes.Reader 很不方便,也没有必要。相反,请考虑将 bytes.Reader 的用法替换为 io.Reader。如果需要使用bytes.Reader,请参考以下代码:
func transform(r io.Reader) (*bytes.Reader, error) {
data, err := io.ReadAll(r)
if err != nil {
return nil, err
}
return bytes.NewReader(data), nil
}