Channels is one of those things that makes Go awesome.
I use channels quite a lot in my next open projects. One of those scenario is to model an event-driven approach.
While developing these projects, I noticed that the setup is more or less the same, so I decided to make a Go module for that.
It's called Cnator
(pronounce "c-nator")
go get gitlab.com/altiano/cnator
It has 3 methods :
New()
-
Subscribe(channel, subscriber)
Serve()
that can be use it like this
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()
just initialized the channels, but you should provide your own model
func createChannels() channels { return channels{ chanA: make(chan struct{}), chanB: make(chan string), chanC: make(chan Person), } }
the subscribers are just callback functions with a matching data type with the channels
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) }
except for chanA
that receive empty struct{},
you can ignore the parameter like receiveChanA()
does.
The job of cnator.Serve()
is to spawn a go routine for each subscription made by cnator.Subscribe(..)
.
It provides some runtime validation like
- whether the subscriber function doesn't satisfy the channel data type or
- whether the channel has not been initialized (i.e. forget to
make(chan ..)
) etc
Full code & examples can be found at this repository : Cnator
Also posted on : https://blog.altiano.dev/cnator-channel-based-subscription-in-go
Top comments (0)