如何将 golang io.reader 转换为 bytes.reader?

问题描述 投票:0回答:1

我有下一个代码:

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?

go parsing split byte reader
1个回答
0
投票

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
}
© www.soinside.com 2019 - 2024. All rights reserved.