gob.go 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. package mhayaGOB
  2. import (
  3. "bytes"
  4. "encoding/gob"
  5. "reflect"
  6. "sync"
  7. )
  8. var (
  9. bufferPool = sync.Pool{
  10. New: func() interface{} {
  11. return new(bytes.Buffer)
  12. },
  13. }
  14. )
  15. func getBuffer(data []byte) *bytes.Buffer {
  16. buffer := bufferPool.Get().(*bytes.Buffer)
  17. if data != nil {
  18. buffer.Write(data)
  19. }
  20. return buffer
  21. }
  22. func putBuffer(buffer *bytes.Buffer) {
  23. if buffer != nil {
  24. buffer.Reset()
  25. bufferPool.Put(buffer)
  26. }
  27. }
  28. func Decode(data []byte, params []reflect.Type) ([]reflect.Value, error) {
  29. buffer := getBuffer(data)
  30. decoder := gob.NewDecoder(buffer)
  31. defer putBuffer(buffer)
  32. valueList := make([]reflect.Value, len(params))
  33. for i, param := range params {
  34. newValue := reflect.New(param)
  35. err := decoder.DecodeValue(newValue)
  36. if err != nil {
  37. return nil, err
  38. }
  39. valueList[i] = newValue.Elem()
  40. }
  41. return valueList, nil
  42. }
  43. func DecodeFunc(data []byte, paramsType reflect.Type) ([]reflect.Value, error) {
  44. paramsLen := paramsType.NumIn()
  45. if paramsLen < 1 {
  46. return nil, nil
  47. }
  48. buffer := getBuffer(data)
  49. decoder := gob.NewDecoder(buffer)
  50. defer putBuffer(buffer)
  51. valueList := make([]reflect.Value, paramsLen)
  52. for i := 0; i < paramsLen; i++ {
  53. params := reflect.New(paramsType.In(i))
  54. err := decoder.DecodeValue(params)
  55. if err != nil {
  56. return nil, err
  57. }
  58. valueList[i] = params.Elem()
  59. }
  60. return valueList, nil
  61. }
  62. func Encode(values ...interface{}) ([]byte, error) {
  63. buffer := getBuffer(nil)
  64. encoder := gob.NewEncoder(buffer)
  65. defer putBuffer(buffer)
  66. var err error
  67. for _, value := range values {
  68. err = encoder.Encode(value)
  69. if err != nil {
  70. return nil, err
  71. }
  72. }
  73. data := buffer.Bytes()
  74. return data, nil
  75. }