경량 이벤트 관리, Go로 구현된 디스패치 도구 라이브러리

event - 경량 이벤트 관리, Go로 구현된 디스패치 도구 라이브러리
  • 사용자 정의 정의 이벤트 개체 지원
  • 이벤트에 여러 수신기 추가 지원
  • 이벤트 수신기의 우선 순위 설정을 지원합니다. 우선 순위가 높을수록 트리거가 높아집니다.
  • 이벤트 이름 접두사를 기반으로 이벤트 리스너 세트를 지원합니다PREFIX.*.
  • add app.* event listen, trigger app.run app.end , 둘 다 app.* 이벤트를 동시에 트리거함

  • 와일드카드*를 사용하여 모든 이벤트에 대한 트리거를 수신하도록 지원
  • 전체 단위 테스트, 단위 적용 범위> 95%

  • 저장소 및 문서


  • Github: https://github.com/gookit/event
  • Godoc for github

  • 설치




    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' 키워드에 의한 비동기 실행 이벤트
  • 좋은 웹페이지 즐겨찾기