경량 이벤트 관리, Go로 구현된 디스패치 도구 라이브러리
20666 단어 githubopensourcegoprogramming
event
- 경량 이벤트 관리, Go로 구현된 디스패치 도구 라이브러리PREFIX.*
.app.*
event listen, trigger app.run
app.end
, 둘 다 app.*
이벤트를 동시에 트리거함*
를 사용하여 모든 이벤트에 대한 트리거를 수신하도록 지원> 95%
저장소 및 문서
설치
go install github.com/gookit/event
빠른 시작
package main
import (
"fmt"
"github.com/gookit/event"
)
func main() {
// Register event listener
event.On("evt1", event.ListenerFunc(func(e event.Event) error {
fmt.Printf("handle event: %s\n", e.Name())
return nil
}), event.Normal)
// Register multiple listeners
event.On("evt1", event.ListenerFunc(func(e event.Event) error {
fmt.Printf("handle event: %s\n", e.Name())
return nil
}), event.High)
// ... ...
// Trigger event
// Note: The second listener has a higher priority, so it will be executed first.
event.MustFire("evt1", event.M{"arg0": "val0", "arg1": "val1"})
}
Note: The second listener has a higher priority, so it will be executed first.
와일드카드 사용
이벤트 리스너를 등록하고 와일드카드로 끝나는 이름을 지정합니다
*
.func main() {
dbListener1 := event.ListenerFunc(func(e event.Event) error {
fmt.Printf("handle event: %s\n", e.Name())
return nil
})
event.On("app.db.*", dbListener1, event.Normal)
}
다른 논리에서 이벤트를 트리거합니다.
func doCreate() {
// do something ...
// Trigger event
event.MustFire("app.db.create", event.M{"arg0": "val0", "arg1": "val1"})
}
func doUpdate() {
// do something ...
// Trigger event
event.MustFire("app.db.update", event.M{"arg0": "val0"})
}
위와 같이
app.db.create
app.db.update
이벤트를 트리거합니다.dbListener1
리스너의 실행을 트리거합니다.이벤트 리스너 작성
익명 함수 사용
이벤트 목록을 빠르게 작성하기 위해 익명 기능을 사용할 수 있습니다.
package mypgk
import (
"fmt"
"github.com/gookit/event"
)
var fnHandler = func(e event.Event) error {
fmt.Printf("handle event: %s\n", e.Name())
return nil
}
func Run() {
// register
event.On("evt1", event.ListenerFunc(fnHandler), event.High)
}
구조 방법 사용
struct를 사용하여 이벤트 목록을 작성할 수 있으며 인터페이스를 구현해야 합니다
event.Listener
.상호 작용:
// Listener interface
type Listener interface {
Handle(e Event) error
}
예시:
Implementation interface
event.Listener
package mypgk
import "github.com/gookit/event"
type MyListener struct {
// userData string
}
func (l *MyListener) Handle(e event.Event) error {
e.Set("result", "OK")
return nil
}
여러 이벤트 리스너 등록
등록을 위한 Can 구현 인터페이스
event.Subscriber
한 번에 여러 이벤트 리스너.상호 작용:
// Subscriber event subscriber interface.
// you can register multi event listeners in a struct func.
type Subscriber interface {
// SubscribedEvents register event listeners
// key: is event name
// value: can be Listener or ListenerItem interface
SubscribedEvents() map[string]interface{}
}
예시
Implementation interface
event.Subscriber
package mypgk
import (
"fmt"
"github.com/gookit/event"
)
type MySubscriber struct {
// ooo
}
func (s *MySubscriber) SubscribedEvents() map[string]interface{} {
return map[string]interface{}{
"e1": event.ListenerFunc(s.e1Handler),
"e2": event.ListenerItem{
Priority: event.AboveNormal,
Listener: event.ListenerFunc(func(e Event) error {
return fmt.Errorf("an error")
}),
},
"e3": &MyListener{},
}
}
func (s *MySubscriber) e1Handler(e event.Event) error {
e.Set("e1-key", "val1")
return nil
}
맞춤 이벤트 작성
이벤트 객체를 커스터마이즈하거나 고정된 이벤트 정보를 미리 정의하고 싶다면,
event.Event
인터페이스를 구현할 수 있습니다.상호 작용:
// Event interface
type Event interface {
Name() string
// Target() interface{}
Get(key string) interface{}
Add(key string, val interface{})
Set(key string, val interface{})
Data() map[string]interface{}
SetData(M) Event
Abort(bool)
IsAborted() bool
}
예:
package mypgk
import "github.com/gookit/event"
type MyEvent struct {
event.BasicEvent
customData string
}
func (e *MyEvent) CustomData() string {
return e.customData
}
용법:
e := &MyEvent{customData: "hello"}
e.SetName("e1")
event.AddEvent(e)
// add listener
event.On("e1", event.ListenerFunc(func(e event.Event) error {
fmt.Printf("custom Data: %s\n", e.(*MyEvent).CustomData())
return nil
}))
// trigger
event.Fire("e1", nil)
// OR
// event.FireEvent(e)
주요 방법
On/Listen(name string, listener Listener, priority ...int)
이벤트 리스너 등록Subscribe/AddSubscriber(sbr Subscriber)
여러 이벤트 리스너의 등록을 지원하기 위해 구독Trigger/Fire(name string, params M) (error, Event)
이름 및 매개변수별로 이벤트 트리거MustTrigger/MustFire(name string, params M) Event
트리거 이벤트, 오류가 있는 경우 패닉이 발생함FireEvent(e Event) (err error)
주어진 이벤트 인스턴스를 기반으로 이벤트를 트리거합니다FireBatch(es ...interface{}) (ers []error)
한 번에 여러 이벤트 트리거AsyncFire(e Event)
'go' 키워드에 의한 비동기 실행 이벤트Reference
이 문제에 관하여(경량 이벤트 관리, Go로 구현된 디스패치 도구 라이브러리), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/inhere/lightweight-event-management-dispatch-tool-library-implemented-by-go-583p텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)