github.com/hoveychen/kafka-go@v0.4.42/sizeof.go (about) 1 package kafka 2 3 import "fmt" 4 5 type sizable interface { 6 size() int32 7 } 8 9 func sizeof(a interface{}) int32 { 10 switch v := a.(type) { 11 case int8: 12 return 1 13 case int16: 14 return 2 15 case int32: 16 return 4 17 case int64: 18 return 8 19 case string: 20 return sizeofString(v) 21 case bool: 22 return 1 23 case []byte: 24 return sizeofBytes(v) 25 case sizable: 26 return v.size() 27 } 28 panic(fmt.Sprintf("unsupported type: %T", a)) 29 } 30 31 func sizeofInt16(_ int16) int32 { 32 return 2 33 } 34 35 func sizeofInt32(_ int32) int32 { 36 return 4 37 } 38 39 func sizeofInt64(_ int64) int32 { 40 return 8 41 } 42 43 func sizeofString(s string) int32 { 44 return 2 + int32(len(s)) 45 } 46 47 func sizeofNullableString(s *string) int32 { 48 if s == nil { 49 return 2 50 } 51 return sizeofString(*s) 52 } 53 54 func sizeofBytes(b []byte) int32 { 55 return 4 + int32(len(b)) 56 } 57 58 func sizeofArray(n int, f func(int) int32) int32 { 59 s := int32(4) 60 for i := 0; i != n; i++ { 61 s += f(i) 62 } 63 return s 64 } 65 66 func sizeofInt32Array(a []int32) int32 { 67 return 4 + (4 * int32(len(a))) 68 } 69 70 func sizeofStringArray(a []string) int32 { 71 return sizeofArray(len(a), func(i int) int32 { return sizeofString(a[i]) }) 72 }