Cnator: Go의 채널 기반 구독

채널은 Go를 멋지게 만드는 요소 중 하나입니다.

다음 공개 프로젝트에서 채널을 많이 사용합니다. 이러한 시나리오 중 하나는 이벤트 기반 접근 방식을 모델링하는 것입니다.

이 프로젝트를 개발하는 동안 설정이 거의 동일하다는 것을 알았고 이에 대한 Go 모듈을 만들기로 결정했습니다.

그것은 Cnator 이라고합니다 (발음 "c-nator")

go get gitlab.com/altiano/cnator


3가지 방법이 있습니다.
  • New()
  • Subscribe(channel, subscriber)
  • Serve()

  • 이렇게 사용할 수 있다는 것

        cnator := cnator.New()
        channels := createChannels()
    
        // provide channel reference to each publisher
        producerA := NewProducerA(channels.chanA)
        producerB := NewProducerB(channels.chanB)
        producerC := NewProducerC(channels.chanC)
    
        // using cnator to subscribe to those channel events
        subscriberA := subscriberA{}
        subscriberB := subscriberB{}
        subscriberC := subscriberC{}
        cnator.Subscribe(channels.chanA, subscriberA.receiveChanA)
        cnator.Subscribe(channels.chanB, subscriberB.receiveChanB)
        cnator.Subscribe(channels.chanC, subscriberC.receiveChanC)
    
         // start watching for events
        cnator.Serve()
    

    createChannel() 방금 채널을 초기화했지만 고유한 모델을 제공해야 합니다.

    func createChannels() channels {
        return channels{
            chanA: make(chan struct{}),
            chanB: make(chan string),
            chanC: make(chan Person),
        }
    }
    


    구독자는 채널과 데이터 유형이 일치하는 콜백 함수일 뿐입니다.

    func (s *subscriberA) receiveChanA() {
        fmt.Println("Subscriber A receiving")
    }
    
    func (s *subscriberB) receiveChanB(data string) {
        fmt.Println("Subscriber B receiving", data)
    }
    
    func (s *subscriberC) receiveChanC(data Person) {
        fmt.Println("Subscriber C receiving", data)
    }
    


    빈 구조체를 수신하는 chanA를 제외하고{},receiveChanA()와 같은 매개변수를 무시할 수 있습니다.
    cnator.Serve() 의 작업은 cnator.Subscribe(..) 가 만든 각 구독에 대해 go 루틴을 생성하는 것입니다.

    다음과 같은 런타임 유효성 검사를 제공합니다.
  • 구독자 기능이 채널 데이터 유형을 충족하지 않거나
  • 채널이 초기화되지 않았는지 여부(즉, make(chan ..)를 잊어버림) 등

  • 전체 코드 및 예제는 이 저장소에서 찾을 수 있습니다. Cnator

    또한 게시: https://blog.altiano.dev/cnator-channel-based-subscription-in-go

    좋은 웹페이지 즐겨찾기