code: func (l *LRUNoTS) Set(key string, val interface{}) error {
  	// try to get item
  	res, err := l.cache.Get(key)
  	if err != nil && err != ErrNotFound {
  		return err
  	}
  
  	var elem *list.Element
  
  	// if elem is not in the cache, push it to front of the list
  	if err == ErrNotFound {
  		elem = l.list.PushFront(&kv{k: key, v: val})
  	} else {
  		// if elem is in the cache, update the data and move it the front
  		elem = res.(*list.Element)
  
  		// update the  data
  		elem.Value.(*kv).v = val
  
  		// item already exists, so move it to the front of the list
  		l.list.MoveToFront(elem)
  	}
  
  	// in any case, set the item to the cache
  	err = l.cache.Set(key, elem)
  	if err != nil {
  		return err
  	}
  
  	// if the cache is full, evict last entry
  	if l.list.Len() > l.size {
  		// remove last element from cache
  		return l.removeElem(l.list.Back())
  	}
  
  	return nil
  }
docs: // Set sets or overrides the given key with the given value, every set item will
  // be moved or prepended to the head of the linked list for keeping track of
  // least recent used item. When the cache is full, last item of the linked list
  // will be evicted from the cache