forked from douban/gobeansdb
-
Notifications
You must be signed in to change notification settings - Fork 0
/
size.go
77 lines (69 loc) · 1.24 KB
/
size.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
package utils
import (
"reflect"
"strconv"
"strings"
)
const (
K = 1024
M = 1024 * K
G = 1024 * M
)
var (
LastSizeErr error
sizemap = map[byte]int{'K': K, 'k': K, 'M': M, 'm': M, 'G': G, 'g': G}
)
func StrToSize(s string) (n int64) {
l := len(s)
if l == 0 {
return 0
}
u := s[l-1]
plus, found := sizemap[u]
if found {
s = s[:l-1]
}
n, e := strconv.ParseInt(s, 10, 32)
if e != nil {
LastSizeErr = e
} else if found {
n *= int64(plus)
}
return
}
func SizeToStr(n int64) (s string) {
if n == 0 {
return "0"
}
units := []string{"", "K", "M", "G"}
i := 0
for n&(1024-1) == 0 {
n >>= 10
i++
}
return strconv.FormatInt(n, 10) + units[i]
}
func InitSizesPointer(c interface{}) (err error) {
LastSizeErr = nil
m := reflect.ValueOf(c).Elem()
InitSizesForValue(m)
err = LastSizeErr
LastSizeErr = nil
return
}
func InitSizesForValue(m reflect.Value) (err error) {
t := m.Type()
n := m.NumField()
for i := 0; i < n; i++ {
f := t.Field(i)
if strings.HasSuffix(f.Name, "Config") { // nested config
InitSizesForValue(m.Field(i))
} else if strings.HasSuffix(f.Name, "Str") {
str := m.Field(i).String()
value := StrToSize(str)
f2 := m.FieldByName(f.Name[:len(f.Name)-3])
f2.SetInt(value)
}
}
return
}