code: func (c *Client) Write(handle uint16, value []byte) error {
  	if len(value) > c.l2c.TxMTU()-3 {
  		return ErrInvalidArgument
  	}
  
  	// Acquire and reuse the txBuf, and release it after usage.
  	txBuf := <-c.chTxBuf
  	defer func() { c.chTxBuf <- txBuf }()
  
  	req := WriteRequest(txBuf[:3+len(value)])
  	req.SetAttributeOpcode()
  	req.SetAttributeHandle(handle)
  	req.SetAttributeValue(value)
  
  	b, err := c.sendReq(req)
  	if err != nil {
  		return err
  	}
  
  	// Convert and validate the response.
  	rsp := WriteResponse(b)
  	switch {
  	case rsp[0] == ErrorResponseCode && len(rsp) == 5:
  		return ble.ATTError(rsp[4])
  	case rsp[0] == ErrorResponseCode && len(rsp) != 5:
  		fallthrough
  	case rsp[0] != rsp.AttributeOpcode():
  		return ErrInvalidResponse
  	}
  	return nil
  }
docs: // Write requests the server to write the value of an attribute and acknowledge that
  // this has been achieved in a Write Response. [Vol 3, Part F, 3.4.5.1 & 3.4.5.2]