github.com/codingeasygo/util@v0.0.0-20231206062002-1ce2f004b7d9/xio/multi.go (about) 1 package xio 2 3 import "io" 4 5 // MultiWriteCloser is WriterCloser to bind one write to mulit sub writer 6 type MultiWriteCloser struct { 7 Writers []io.Writer 8 } 9 10 // NewMultiWriter will return new MultiWriteCloser 11 func NewMultiWriter(writers ...io.Writer) (writer *MultiWriteCloser) { 12 writer = &MultiWriteCloser{Writers: writers} 13 return 14 } 15 16 func (m *MultiWriteCloser) Write(p []byte) (n int, err error) { 17 for _, w := range m.Writers { 18 n, err = w.Write(p) 19 if err != nil { 20 break 21 } 22 if n != len(p) { 23 err = io.ErrShortWrite 24 break 25 } 26 } 27 return 28 } 29 30 // Close will try close all writer if it is io.Closer 31 func (m *MultiWriteCloser) Close() (err error) { 32 for _, w := range m.Writers { 33 if closer, ok := w.(io.Closer); ok { 34 xerr := closer.Close() 35 if err == nil { 36 err = xerr 37 } 38 } 39 } 40 return 41 }