12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394 |
- package mhayaGOB
- import (
- "bytes"
- "encoding/gob"
- "reflect"
- "sync"
- )
- var (
- bufferPool = sync.Pool{
- New: func() interface{} {
- return new(bytes.Buffer)
- },
- }
- )
- func getBuffer(data []byte) *bytes.Buffer {
- buffer := bufferPool.Get().(*bytes.Buffer)
- if data != nil {
- buffer.Write(data)
- }
- return buffer
- }
- func putBuffer(buffer *bytes.Buffer) {
- if buffer != nil {
- buffer.Reset()
- bufferPool.Put(buffer)
- }
- }
- func Decode(data []byte, params []reflect.Type) ([]reflect.Value, error) {
- buffer := getBuffer(data)
- decoder := gob.NewDecoder(buffer)
- defer putBuffer(buffer)
- valueList := make([]reflect.Value, len(params))
- for i, param := range params {
- newValue := reflect.New(param)
- err := decoder.DecodeValue(newValue)
- if err != nil {
- return nil, err
- }
- valueList[i] = newValue.Elem()
- }
- return valueList, nil
- }
- func DecodeFunc(data []byte, paramsType reflect.Type) ([]reflect.Value, error) {
- paramsLen := paramsType.NumIn()
- if paramsLen < 1 {
- return nil, nil
- }
- buffer := getBuffer(data)
- decoder := gob.NewDecoder(buffer)
- defer putBuffer(buffer)
- valueList := make([]reflect.Value, paramsLen)
- for i := 0; i < paramsLen; i++ {
- params := reflect.New(paramsType.In(i))
- err := decoder.DecodeValue(params)
- if err != nil {
- return nil, err
- }
- valueList[i] = params.Elem()
- }
- return valueList, nil
- }
- func Encode(values ...interface{}) ([]byte, error) {
- buffer := getBuffer(nil)
- encoder := gob.NewEncoder(buffer)
- defer putBuffer(buffer)
- var err error
- for _, value := range values {
- err = encoder.Encode(value)
- if err != nil {
- return nil, err
- }
- }
- data := buffer.Bytes()
- return data, nil
- }
|