Идиоматический способ конвертировать из сканера в io.Reader - PullRequest
0 голосов
/ 22 декабря 2018

Недавно я столкнулся с проблемой чтения из файла CSV, применения некоторых преобразований к каждой строке и записи в запрос HTTP.

Проблема, с которой я столкнулся, заключалась в том, как преобразовать построчное считывающее устройство, которое возвращает произвольное количество байтов (например, сканер), в считывающее устройство байтов, которое возвращает фиксированное количество байтов на каждомcall to Read ().

Лучшее решение, которое я придумал, - это создать собственный io.Reader, который будет считывать данные со сканера и локально буферизовать байты, если они не подходят.Затем буферизованные байты будут возвращены при следующем вызове Read ().

Вот что я придумал: https://gist.github.com/paulsc/6a0bf30a2a8d898f7a8086aedf6af1e1

Интуитивно, это похоже на неправильное решение, потому чтокод кажется довольно низкоуровневым решением, которое может быть уже в стандартной библиотеке.

Есть ли лучший, более идиоматичный способ сделать это со стандартными компонентами go?

1 Ответ

0 голосов
/ 22 декабря 2018

Простой метод использует 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...