code: func (t *Collection) GetItem(key []byte, withValue bool) (i *Item, err error) {
  	rnl := t.rootAddRef()
  	defer t.rootDecRef(rnl)
  	n := rnl.root
  	for {
  		nNode, err := n.read(t.store)
  		if err != nil || n.isEmpty() || nNode == nil {
  			return nil, err
  		}
  		i := &nNode.item
  		iItem, err := i.read(t, false)
  		if err != nil {
  			return nil, err
  		}
  		if iItem == nil || iItem.Key == nil {
  			return nil, errors.New("missing item after item.read() in GetItem()")
  		}
  		c := t.compare(key, iItem.Key)
  		if c < 0 {
  			n = &nNode.left
  		} else if c > 0 {
  			n = &nNode.right
  		} else {
  			if withValue {
  				iItem, err = i.read(t, withValue)
  				if err != nil {
  					return nil, err
  				}
  			}
  			t.store.ItemAddRef(t, iItem)
  			return iItem, nil
  		}
  	}
  }
docs: // Retrieve an item by its key.  Use withValue of false if you don't
  // need the item's value (Item.Val may be nil), which might be able
  // to save on I/O and memory resources, especially for large values.
  // The returned Item should be treated as immutable.