base-golang/pkg/websocket/codec/meta.go

44 lines
851 B
Go
Raw Permalink Normal View History

2024-07-23 10:23:43 +08:00
package codec
import (
"fmt"
"reflect"
"sync"
)
type MsgPack struct {
Router any
DataPtr any
Err error
}
var modelMap = make(map[any]reflect.Type)
var modelMapLock sync.RWMutex
func RegisterMessage(router any, datePtr any) {
modelMapLock.Lock()
defer modelMapLock.Unlock()
if _, ok := modelMap[router]; ok {
fmt.Println(fmt.Sprintf("codec: repeat registration. router:%s ", router))
return
}
if t, ok := datePtr.(reflect.Type); ok {
modelMap[router] = t.Elem()
} else {
t := reflect.TypeOf(datePtr)
if t.Kind() != reflect.Ptr {
panic(fmt.Errorf("codec: cannot use non-ptr message struct `%s`", t))
}
modelMap[router] = t.Elem()
}
}
func GetMessage(router any) any {
modelMapLock.RLock()
defer modelMapLock.RUnlock()
if ptr, ok := modelMap[router]; ok {
return reflect.New(ptr).Interface()
}
return nil
}