如何连接io.Reader和io.Writer?

Met*_*kao 9 io go

我正在写一个长期运行的任务,从mongodb(使用mgo)多次获取.然后使用此模块将其写入xlsx文件.然后再次阅读,os.Open然后将其存储到我的ftp服务器.

Stor函数消耗我的内存这么多,所以我认为应该有一种方法不保存文件,但直接将我的数据从xlsx.Write传递给ftp.Store.(如果我可以同时进行流式处理将是完美的,因为在将它们发送到Stor函数之前我不必将所有文档都保存在服务器的内存中)

这些是功能的原型

func (f *File) Write(writer io.Writer) (err error) XLSL

func (ftp *FTP) Stor(path string, r io.Reader) (err error) FTP

hob*_*bbs 11

你想使用io.Pipe.你可以做:

reader, writer := io.Pipe()
errChan := make(chan error)
go func() {
    errChan <- myFTP.Stor(path, reader)
}()
err := myXLS.Write(writer)
// handle err
err = <-errChan
// handle err
Run Code Online (Sandbox Code Playgroud)

您可能希望writer.CloseWithError(err)if xlsx.Write在不关闭writer的情况下返回错误.

  • @ MethuzKaewsai-kao:[`io.Reader`](https://golang.org/pkg/io/#Reader)是一个接口,`*PipeReader`是一个实现`io.Reader`接口的具体类型.(同样适用于编写者.)所以是的,你可以在任何接受`io.Reader`的地方使用`*PipeReader`. (3认同)