code: func (c *Client) Observe(vb uint16, key string) (result ObserveResult, err error) {
  	// http://www.couchbase.com/wiki/display/couchbase/Observe
  	body := make([]byte, 4+len(key))
  	binary.BigEndian.PutUint16(body[0:2], vb)
  	binary.BigEndian.PutUint16(body[2:4], uint16(len(key)))
  	copy(body[4:4+len(key)], key)
  
  	res, err := c.Send(&gomemcached.MCRequest{
  		Opcode:  gomemcached.OBSERVE,
  		VBucket: vb,
  		Body:    body,
  	})
  	if err != nil {
  		return
  	}
  
  	// Parse the response data from the body:
  	if len(res.Body) < 2+2+1 {
  		err = io.ErrUnexpectedEOF
  		return
  	}
  	outVb := binary.BigEndian.Uint16(res.Body[0:2])
  	keyLen := binary.BigEndian.Uint16(res.Body[2:4])
  	if len(res.Body) < 2+2+int(keyLen)+1+8 {
  		err = io.ErrUnexpectedEOF
  		return
  	}
  	outKey := string(res.Body[4 : 4+keyLen])
  	if outVb != vb || outKey != key {
  		err = fmt.Errorf("observe returned wrong vbucket/key: %d/%q", outVb, outKey)
  		return
  	}
  	result.Status = ObservedStatus(res.Body[4+keyLen])
  	result.Cas = binary.BigEndian.Uint64(res.Body[5+keyLen:])
  	// The response reuses the Cas field to store time statistics:
  	result.PersistenceTime = time.Duration(res.Cas>>32) * time.Millisecond
  	result.ReplicationTime = time.Duration(res.Cas&math.MaxUint32) * time.Millisecond
  	return
  }
docs: // Observe gets the persistence/replication/CAS state of a key