sizeof.go 1.2 KB

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