добавил функцию, которая возвращает размер всего кэша

main v3.0.0
serr 2025-01-05 17:18:30 +03:00
parent 8bb4a485c4
commit 51ed3c8744
1 changed files with 68 additions and 0 deletions

View File

@ -2,6 +2,8 @@ package simplecache
import ( import (
"errors" "errors"
"fmt"
"reflect"
"sync" "sync"
"time" "time"
) )
@ -142,6 +144,72 @@ func (c *Cache) List() []KeyItemPair {
return items return items
} }
// Вернет размер всего кэша в байтах.
func (c *Cache) Size() int {
c.RLock()
defer c.RUnlock()
size := 0
for key, item := range c.storage {
size += isize(key) + isize(item.data) + isize(item.destroyTimestamp)
}
return size
}
// ПОДДЕРЖИВАЕМЫЕ ТИПЫ:
// Bool +
// Int +
// Int8 +
// Int16 +
// Int32 +
// Int64 +
// Uint +
// Uint8 +
// Uint16 +
// Uint32 +
// Uint64 +
// Uintptr +
// Float32 +
// Float64 +
// Complex64 +
// Complex128 +
// Array +
// Func +
// Map +
// Slice +
// String +
// Struct
func isize(i interface{}) int {
if i == nil {
return 0
}
val := reflect.ValueOf(i)
kind := val.Kind()
fmt.Println("val =", val, "kind =", kind)
size := 0
switch kind {
case reflect.Slice, reflect.Array, reflect.String:
len := val.Len()
for i := 0; i < len; i++ {
size += isize(val.Index(i).Interface())
}
return size
case reflect.Map:
for _, key := range val.MapKeys() {
size += isize(key.Interface()) + isize(val.MapIndex(key).Interface())
}
return size
case reflect.Struct:
for i := 0; i < val.NumField(); i++ {
size += isize(val.Field(i).Interface())
}
return size
default:
return int(reflect.TypeOf(i).Size())
}
}
// Возвращает данные элемента кэша. // Возвращает данные элемента кэша.
func (i *Item) Data() interface{} { func (i *Item) Data() interface{} {
return i.data return i.data