channels
channels copied to clipboard
Wrap for `in` channel?
Hi,
I'm a bit lost with examples. Let's say I have 3 channels:
out1 := make(chan string, 10)
out2 := make(chan string, 10)
in := make(chan string, 20)
Now I would like to multiplex them:
Multiplex(output SimpleInChannel, inputs ...SimpleOutChannel)
The problem is that I would need to convert them to interfaces SimpleInChannel
and SimpleOutChannel
. For SimpleOutChannel
there is func Wrap(ch interface{}) SimpleOutChannel
, there is no such function for SimpleInChannel
.
In my case I create the in
chan, it's not delivered from external source, so I could use func NewNativeChannel(size BufferCap) NativeChannel
but the method func (ch NativeChannel) Out() <-chan interface{}
returns <-chan interface{}
so I can't "convert" it to chan string
. In other words I would need to now read values from <-chan interface{}
and push them to chan string
- or I'm missing something?
What could work is if the library operates strictly on interface{}
type like in the case of Wrap
and use Value.Send()
from reflect package instead of <-
in multiplexer https://github.com/eapache/channels/blob/master/channels.go#L109.
It is mentioned in the godoc that:
Due to limitations of Go's type system, importing this library directly is often not practical for production code.
This kind of dance around type-casting is one of the things I was referring to :)
In other words I would need to now read values from <-chan interface{} and push them to chan string - or I'm missing something?
You can use Unwrap
for this.
func Unwrap(input SimpleOutChannel, output interface{})
So it operates on out
channel, not on in
channel. It's a reverse for Wrap
.
I think there should be WrapOut
WrapIn
UnwrapOut
UnwrapIn
. But to be honest the best would be to not create additional chan interface{}
rather all types should be interface{}
and then just check for correction with reflection if they are chan
or not.
I'm writing my own multiplexer right, let's see if it works, I will share when I finish.