package bus import ( "encoding/json" "sync" "time" ) var ( eventPool = new(sync.Pool) ) func applyEvent() *Event { if v := eventPool.Get(); v == nil { return &Event{ Timestamp: time.Now().Unix(), } } else { e := v.(*Event) e.Timestamp = time.Now().Unix() e.Header = make(map[string]string) e.Body = nil return e } } func releaseEvent(e *Event) { eventPool.Put(e) } type Event struct { Name string `json:"name"` Domain string `json:"-"` Trigger string `json:"-"` //触发的用户,用于一些订阅者过滤数据 Timestamp int64 `json:"ts"` Header map[string]string `json:"meta"` Body []byte `json:"body,omitempty"` } func (e *Event) WithTrigger(target string) *Event { e.Trigger = target return e } func (e *Event) Set(k, v string) *Event { if e.Header == nil { e.Header = make(map[string]string) } e.Header[k] = v return e } func (e *Event) MultiSet(ss ...string) *Event { if len(ss)%2 != 0 { return e } if e.Header == nil { e.Header = make(map[string]string) } for i := 0; i < len(ss); i += 2 { e.Header[ss[i]] = ss[i+1] } return e } func (e *Event) Get(k string) string { if e.Header == nil { return "" } return e.Header[k] } func (e *Event) Encode() (buf []byte) { buf, _ = json.Marshal(e) return } func NewEvent(name string, domain string) *Event { e := applyEvent() e.Name = name e.Domain = domain return e }