code: func (c *Conn) Read(b []byte) (int, error) {
  	c.readMu.Lock()
  	defer c.readMu.Unlock()
  
  	deadline := c.readCancel()
  
  	numRead := 0
  	for numRead != len(b) {
  		if len(c.read) == 0 {
  			var err error
  			c.read, err = commonRead(c.ep, c.wq, deadline, nil, c, numRead != 0)
  			if err != nil {
  				if numRead != 0 {
  					return numRead, nil
  				}
  				return numRead, err
  			}
  		}
  		n := copy(b[numRead:], c.read)
  		c.read.TrimFront(n)
  		numRead += n
  		if len(c.read) == 0 {
  			c.read = nil
  		}
  	}
  	return numRead, nil
  }
docs: // Read implements net.Conn.Read.