writer.go
func (z *Writer) Write(buf []byte) (int, error) {
	if !z.Header.done {
		if err := z.writeHeader(); err != nil {
			return 0, err
		}
	}
	if debugFlag {
		debug("input buffer len=%d index=%d", len(buf), z.idx)
	}

	zn := len(z.data)
	var n int
	for len(buf) > 0 {
		if z.idx == 0 && len(buf) >= zn {
			// Avoid a copy as there is enough data for a block.
			if err := z.compressBlock(buf[:zn]); err != nil {
				return n, err
			}
			n += zn
			buf = buf[zn:]
			continue
		}
		// Accumulate the data to be compressed.
		m := copy(z.data[z.idx:], buf)
		n += m
		z.idx += m
		buf = buf[m:]
		if debugFlag {
			debug("%d bytes copied to buf, current index %d", n, z.idx)
		}

		if z.idx < len(z.data) {
			// Buffer not filled.
			if debugFlag {
				debug("need more data for compression")
			}
			return n, nil
		}

		// Buffer full.
		if err := z.compressBlock(z.data); err != nil {
			return n, err
		}
		z.idx = 0
	}

	return n, nil
}
func (z *Writer) Write(buf []byte) (int, error) {
	if !z.Header.done {
		if err := z.writeHeader(); err != nil {
			return 0, err
		}
	}
	if debugFlag {
		debug("input buffer len=%d index=%d", len(buf), z.idx)
	}

	zn := len(z.data)
	var n int
	for len(buf) > 0 {
		if z.idx == 0 && len(buf) >= zn {
			// Avoid a copy as there is enough data for a block.
			if err := z.compressBlock(buf[:zn]); err != nil {
				return n, err
			}
			n += zn
			buf = buf[zn:]
			continue
		}
		// Accumulate the data to be compressed.
		m := copy(z.data[z.idx:], buf)
		n += m
		z.idx += m
		buf = buf[m:]
		if debugFlag {
			debug("%d bytes copied to buf, current index %d", n, z.idx)
		}

		if z.idx < len(z.data) {
			// Buffer not filled.
			if debugFlag {
				debug("need more data for compression")
			}
			return n, nil
		}

		// Buffer full.
		if err := z.compressBlock(z.data); err != nil {
			return n, err
		}
		z.idx = 0
	}

	return n, nil
}
func ( z * Writer ) Write ( buf [ ] byte ) ( int , error ) { if ! z . Header . done { if err := z . writeHeader ( ) ; err != nil { return 0 , err } } if debugFlag { debug ( " " , len ( buf ) , z . idx ) } zn := len ( z . data ) var n int for len ( buf ) > 0 { if z . idx == 0 && len ( buf ) >= zn { // Avoid a copy as there is enough data for a block. if err := z . compressBlock ( buf [ : zn ] ) ; err != nil { return n , err } n += zn buf = buf [ zn : ] continue } // Accumulate the data to be compressed. m := copy ( z . data [ z . idx : ] , buf ) n += m z . idx += m buf = buf [ m : ] if debugFlag { debug ( " " , n , z . idx ) } if z . idx < len ( z . data ) { // Buffer not filled. if debugFlag { debug ( " " ) } return n , nil } // Buffer full. if err := z . compressBlock ( z . data ) ; err != nil { return n , err } z . idx = 0 } return n , nil }
// Write compresses data from the supplied buffer into the underlying io.Writer.
// Write does not return until the data has been written.
Write compresses data from the supplied buffer into the underlying io . Writer . Write does not return until the data has been written .