code: func (l *lazyClientConn) Read(b []byte) (int, error) {
  	l.rhandshakeOnce.Do(func() {
  		go l.whandshakeOnce.Do(l.doWriteHandshake)
  		l.doReadHandshake()
  	})
  	if l.rerr != nil {
  		return 0, l.rerr
  	}
  	if len(b) == 0 {
  		return 0, nil
  	}
  
  	return l.con.Read(b)
  }
docs: // Read reads data from the io.ReadWriteCloser.
  //
  // If the protocol hasn't yet been negotiated, this method triggers the write
  // half of the handshake and then waits for the read half to complete.
  //
  // It returns an error if the read half of the handshake fails.