从扫描仪转换为io.Reader的惯用方式

时间:2018-12-22 10:33:29

标签: go io

我最近遇到了这样一个问题:如何从CSV文件中读取,对每行进行一些转换以及写入HTTP请求。

我面临的问题是如何从逐行读取器转换为字节读取器,逐行读取器返回任意数量的字节(如扫描仪),字节读取器在每次调用Read时返回固定数量的字节()。

我想出的最好的解决方案是建立一个自定义的io.Reader,它将从扫描器读取并在不适合的地方在本地缓存字节。然后,在下次调用Read()时将返回缓冲的字节。

这是我想出的: https://gist.github.com/paulsc/6a0bf30a2a8d898f7a8086aedf6af1e1

直觉上,这感觉像是错误的解决方案,因为代码似乎是一个相当底层的解决方案,可能已经在标准库中了。

是否有更好的方法,更惯用的标准go组件呢?

1 个答案:

答案 0 :(得分:0)

一种简单的方法是使用io.Pipe

func ScannerToReader(scanner *bufio.Scanner) io.Reader {
    reader, writer := io.Pipe()


    go func() {
        defer writer.Close()
        for scanner.Scan() {
            writer.Write(scanner.Bytes())
        }
    }()

    return reader
}