2015-07-07 11 views
5

Sto scrivendo un'attività a lunga esecuzione che recupera da mongodb (usando mgo) più volte. Quindi scrivilo su un file xlsx usando this module. Quindi rileggilo usando os.Open quindi memorizzalo sul mio server ftp.Come collegare io.Reader e io.Writer?

Stor la funzione consuma così tanto la memoria, quindi penso che ci dovrebbe essere un modo per non salvare il file ma passare i miei dati da xlsx.Write a ftp.Store direttamente. (Se posso streaming contemporaneamente sarebbe perfetto perché io non devo tenere tutti i miei documenti in memoria del server prima di inviarli alla funzione Stor)

Questi sono prototipi delle funzioni

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

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

risposta

7

Si desidera utilizzare io.Pipe. Si può fare:

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 

Si potrebbe desiderare di writer.CloseWithError(err) se xlsx.Write restituisce un errore senza chiudere lo scrittore.

+0

io.Pipe() non restituisce io.Writer e io.Reader ma restituisce * PipeReader, * PipeWriter. Sono gli stessi? –

+1

@ MethuzKaewsai-kao: ['io.Reader'] (https://golang.org/pkg/io/#Reader) è un'interfaccia,' * PipeReader' è un tipo concreto che implementa l'interfaccia 'io.Reader' . (Lo stesso vale per gli scrittori). Quindi sì, puoi usare un '* PipeReader' in qualsiasi posto che accetti un' io.Reader'. – LeGEC