sizeof.go 1.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  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 sizeofInt16(_ int16) int32 {
  28. return 2
  29. }
  30. func sizeofInt32(_ int32) int32 {
  31. return 4
  32. }
  33. func sizeofInt64(_ int64) int32 {
  34. return 8
  35. }
  36. func sizeofString(s string) int32 {
  37. return 2 + int32(len(s))
  38. }
  39. func sizeofNullableString(s *string) int32 {
  40. if s == nil {
  41. return 2
  42. }
  43. return sizeofString(*s)
  44. }
  45. func sizeofBytes(b []byte) int32 {
  46. return 4 + int32(len(b))
  47. }
  48. func sizeofArray(n int, f func(int) int32) int32 {
  49. s := int32(4)
  50. for i := 0; i != n; i++ {
  51. s += f(i)
  52. }
  53. return s
  54. }
  55. func sizeofInt32Array(a []int32) int32 {
  56. return 4 + (4 * int32(len(a)))
  57. }
  58. func sizeofStringArray(a []string) int32 {
  59. return sizeofArray(len(a), func(i int) int32 { return sizeofString(a[i]) })
  60. }