2015-07-07 14 views
5

Piszę długo działające zadanie, które wielokrotnie pobierane z mongodb (używając mgo). Następnie zapisz go w pliku xlsx, używając this module. Następnie przeczytaj go ponownie, używając os.Open, a następnie zapisz go na moim serwerze ftp.Jak podłączyć io.Reader i io.Writer?

Stor funkcja zużywają moją pamięć tak bardzo, więc myślę, że powinien być sposób, aby nie zapisać plik, ale przekazać moje dane z Xlsx.Write do ftp.Store bezpośrednio. (Jeśli mogę przesyłać jednocześnie byłby idealny, ponieważ nie muszę trzymać wszystkie moje dokumenty w pamięci serwera przed wysłaniem ich do funkcji Stor)

Są to prototyp funkcji

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

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

Odpowiedz

7

Chcesz użyć io.Pipe. Można to zrobić:

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 

Możesz chcieć writer.CloseWithError(err) jeśli xlsx.Write zwraca błąd bez zamykania pisarza.

+0

io.Pipe() nie zwraca io.Writer i io.Reader, ale zamiast tego zwraca * PipeReader, * PipeWriter. Czy oni są tacy sami? –

+1

@ MethuzKaewsai-kao: ['io.Reader'] (https://golang.org/pkg/io/#Reader) to interfejs,' * PipeReader' to konkretny typ implementujący interfejs 'io.Reader' . (To samo dotyczy pisarzy.) Tak, możesz użyć '* PipeReader' w dowolnym miejscu, które akceptuje' io.Reader'. – LeGEC