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  }