// GetAndDo returns the value corresponding to the key, and apply fn to key value before return value
// return (value, value exist or not, error when evaluation fn)
func (cmap *ShardedConcurrentTxMap) GetAndDo(key any, fn ActionFunc) (any, bool, error) {
concurrent_tx_map.go
shard := cmap.getShard(key)
var value any
var ok bool
var err error
shard.Lock()
if shard.items != nil {
value, ok = shard.items[key]
if ok {