
Golang script to send and receive events with a tiny simple API - gianlucaguarini
https://github.com/GianlucaGuarini/go-observable
======
ridiculous_fish
This package is using threads but not safely. A call to Trigger kicks off the
`listen` function in a background thread, which accesses a map and walks over
a list of callbacks. If you then call On() or Off() immediately after Trigger,
that map and/or list gets modified while `listen` is walking it. This is a
serious problem.

It's great that there's tests, but all of the tests follow the same pattern:
On and then Trigger. It's the reverse order that's busted.

~~~
mitchellh
The above is completely correct.

In addition to this, there is a lot of `reflect` usage. This in and of itself
isn't really a problem, but this will really slow down the usage and I imagine
there are relatively high performance use cases for the observer pattern.

Not trying to discourage you or anything! It is great that you built something
and made it available for the world. Just trying to give some hints from
someone that has worked with Go a lot (parent has as well!)

~~~
gianlucaguarini
Ok thanks I will try to add some performance tests

------
empressplay
A nitpick, but thing-what-compiles is not a "script".

------
iofj
This API mostly shows just how badly Go needs generics. Would you really not
want any data into those events ?

But you can't design an API like that in Go, it just wouldn't work.

------
AYBABTME
Seems to only work with a single receiver, in a synchronous manner, in which
case I wonder what's the point of using that instead of a simple function
call.

------
fiatjaf
I'm curious about use cases for this.

~~~
simoncion
This smells to me like a Publish/Subscribe mechanism. [0]

I mean, this would be useful anywhere you want to send events/messages to some
number of interested "parties", when you don't necessarily know what or who
those parties are going to be ahead of time.

I'm not snarking when I ask this, it's a genuine question: Have you ever done
that sort of thing before?

[0]
[https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_patt...](https://en.wikipedia.org/wiki/Publish%E2%80%93subscribe_pattern)

~~~
gianlucaguarini
I am not reinventing the wheel here I have just tried to add a pattern I
really like in other programming languages that I was missing in Go. You can
use it however you want, and if you don't like it just use something else.

> Have you ever done that sort of thing before? yes I did that's one of the
> reasons I had to code go-observable

~~~
simoncion
> I am not reinventing the wheel here...

I never said that you were. :)

> yes I did that's one of the reasons I had to code go-observable

I don't mean to sound mean or anything like this, but you _do_ know that this
question was directed _directly_ at fiatjaf, and noone else, right? :) [0] I
mean, I guess I appreciate the input, but I asked the question because it
seemed obvious to me -because I spent several years working with software that
made use of Pub/Sub mechanisms- that go-observable was a Pub/Sub mechanism for
Go. So... I was wondering if fiatjaf had ever done any such thing in the past.

Obviously, as _you_ are publishing a pub/sub mechanism in a given language
it's either because you had need to do it in the past (or you were just doing
it for funzies) and are sharing the fruits of your efforts. :)

[0] Or did my comment appear to be a direct descendent of your HN post, rather
than a descendent of fiatjaf's question? I've heard _that_ particular bug
mentioned once or twice in the past.

~~~
gianlucaguarini
Ok sorry I thought the question was referred to me :) There are many pub/sub
modules for go but I made this one because I was missing in some case the
asynchronous callbacks that I can use with other languages ( node for example
) but in a really simple way without too many ceremony (probably I am too
stupid for other solutions) and also with the benefit of using the async go
routines that IMHO are an advantage and not cons like someone else pointed out
(performance tests are still needed here)

