| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869 | package bufimport (	"io"	"sync")// BufferToBytesWriter is a Writer that writes alloc.Buffer into underlying writer.type BufferToBytesWriter struct {	writer io.Writer}// Write implements Writer.Write(). Write() takes ownership of the given buffer.func (v *BufferToBytesWriter) Write(buffer *Buffer) error {	defer buffer.Release()	for {		nBytes, err := v.writer.Write(buffer.Bytes())		if err != nil {			return err		}		if nBytes == buffer.Len() {			break		}		buffer.SliceFrom(nBytes)	}	return nil}// Release implements Releasable.Release().func (v *BufferToBytesWriter) Release() {	v.writer = nil}type BytesToBufferWriter struct {	sync.Mutex	writer Writer}func (v *BytesToBufferWriter) Write(payload []byte) (int, error) {	v.Lock()	defer v.Unlock()	if v.writer == nil {		return 0, io.ErrClosedPipe	}	bytesWritten := 0	size := len(payload)	for size > 0 {		buffer := New()		nBytes, _ := buffer.Write(payload)		size -= nBytes		payload = payload[nBytes:]		bytesWritten += nBytes		err := v.writer.Write(buffer)		if err != nil {			return bytesWritten, err		}	}	return bytesWritten, nil}// Release implements Releasable.Release()func (v *BytesToBufferWriter) Release() {	v.Lock()	v.writer.Release()	v.writer = nil	v.Unlock()}
 |