func (c *CCMap) Get(key string) interface{} {
	sliceMap := c.GetSliceMap(key)
	sliceMap.lock.RLock()
	value, ok := sliceMap.items[key]
	if ok {
		sliceMap.lock.RUnlock()
		return value
	}
	sliceMap.lock.RUnlock()
	return nil
}
get by key
package fasthttpsession
import (
	"sync"
)
var (
	defaultSliceNumber = 32
)
type CCMap struct {
	sliceNumber int
	values      []*MapSlice
}
type MapSlice struct {
	lock  sync.RWMutex
	items map[string]interface{}
}
func NewDefaultCCMap() *CCMap {
	return NewCCMap(defaultSliceNumber)
}
func NewCCMap(sliceNumber int) *CCMap {
	ccMap := &CCMap{
		sliceNumber: sliceNumber,
		values:      make([]*MapSlice, sliceNumber),
	}
	for i := 0; i < sliceNumber; i++ {
		ccMap.values[i] = &MapSlice{
			items: make(map[string]interface{}),
		}
	}
	return ccMap
}
func fnvHash(key string) uint32 {
	hash := uint32(2166136261)
	const prime32 = uint32(16777619)
	for i := 0; i < len(key); i++ {
		hash *= prime32
		hash ^= uint32(key[i])
	}
	return hash
}
func (c *CCMap) GetSliceMap(key string) *MapSlice {
	return c.values[uint(fnvHash(key))%uint(c.sliceNumber)]
}
func (c *CCMap) IsExist(key string) bool {
	sliceMap := c.GetSliceMap(key)
	sliceMap.lock.RLock()
	_, ok := sliceMap.items[key]
	sliceMap.lock.RUnlock()
	return ok
}
func (c *CCMap) Set(key string, value interface{}) {
	sliceMap := c.GetSliceMap(key)
	sliceMap.lock.Lock()
	sliceMap.items[key] = value
	sliceMap.lock.Unlock()
}