go-generics-cache is an in-memory key:value store/cache that is suitable for applications running on a single machine. This in-memory cache uses Go Generics which is introduced in 1.18.
- a thread-safe
 - implemented with Go Generics
 - TTL supported (with expiration times)
 - Simple cache is like 
map[string]interface{}- See examples
 
 - Cache replacement policies
- Least recently used (LRU)
- Discards the least recently used items first.
 - See examples
 
 - Least-frequently used (LFU)
- Counts how often an item is needed. Those that are used least often are discarded first.
 - An O(1) algorithm for implementing the LFU cache eviction scheme
 - See examples
 
 - First in first out (FIFO)
- Using this algorithm the cache behaves in the same way as a FIFO queue.
 - The cache evicts the blocks in the order they were added, without any regard to how often or how many times they were accessed before.
 - See examples
 
 - Most recently used (MRU)
- In contrast to Least Recently Used (LRU), MRU discards the most recently used items first.
 - See examples
 
 - Clock
- Clock is a more efficient version of FIFO than Second-chance cache algorithm.
 - See examples
 
 
 - Least recently used (LRU)
 
Go 1.18 or later.
$ go get github.com/Code-Hex/go-generics-cache
See also examples or go playground
package main
import (
	"context"
	"fmt"
	"time"
	cache "github.com/Code-Hex/go-generics-cache"
)
func main() {
	ctx, cancel := context.WithCancel(context.Background())
	defer cancel()
	// use simple cache algorithm without options.
	c := cache.NewContext[string, int](ctx)
	c.Set("a", 1)
	gota, aok := c.Get("a")
	gotb, bok := c.Get("b")
	fmt.Println(gota, aok) // 1 true
	fmt.Println(gotb, bok) // 0 false
	// Create a cache for Number constraint. key as string, value as int.
	nc := cache.NewNumber[string, int]()
	nc.Set("age", 26, cache.WithExpiration(time.Hour))
	incremented := nc.Increment("age", 1)
	fmt.Println(incremented) // 27
	decremented := nc.Decrement("age", 1)
	fmt.Println(decremented) // 26
}