code: 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
  }
docs: // Write compresses data from the supplied buffer into the underlying io.Writer.
  // Write does not return until the data has been written.