avatarDawn Bevier

Free AI web copilot to create summaries, insights and extended knowledge, download it at here

5070

Abstract

do that:</p><div id="2e8b"><pre>eventHandler<span class="hljs-selector-class">.Handle</span>(event1, <span class="hljs-built_in">ExampleMiddlewareFoo</span>(<span class="hljs-built_in">ExampleMiddlewareBar</span>(handle)))</pre></div><h1 id="a8a5">Managing Events with Handlers and Middleware</h1><p id="f869">Most articles I read explain how to use this design pattern; this one deals with implementing the internal logic. So let's start coding.</p><p id="35c4">The full code for this article can be found <a href="https://github.com/xNok/slack-go-demo-socketmode/blob/main/examples/middleware/main.go">here</a> to help you follow along.</p><h2 id="0f88">Designing events</h2><p id="b622">First, we are going to enumerate the list of events that our system can handle. The way we create enumeration in Go is a bit different than in other programming languages. In Go, we are going to use a set of constants sharing the same <code>type</code>. Here I define a type <code>EventType</code>that represents a string with the event's name.</p><div id="b181"><pre>// <span class="hljs-keyword">type</span> <span class="hljs-type">used </span>to enumerate events <span class="hljs-keyword">type</span> <span class="hljs-type">EventType </span>string</pre></div><div id="4817"><pre>const ( event1 EventType <span class="hljs-operator">=</span> <span class="hljs-string">"event1"</span> event2 EventType <span class="hljs-operator">=</span> <span class="hljs-string">"event2"</span> )</pre></div><p id="e041">Next, we define the event itself. In our example, the<code>Event</code> as a type which can be selected among the list of <code>EventType</code> created above.</p><div id="2bc9"><pre><span class="hljs-keyword">type</span> <span class="hljs-type">Event</span> struct { <span class="hljs-type">Type</span> <span class="hljs-type">EventType</span> <span class="hljs-type">Data</span> interface{} }</pre></div><h2 id="df6c">Create an event sender (for test purpose)</h2><p id="60aa">To test our system, we will need to create a small function to send events every 2s. Each<code>Event</code> is transmitted via a <a href="https://tour.golang.org/concurrency/2">channel</a> and, the <code>eventSender</code> below sends a random <code>Event</code> of type <code>event1</code> or <code>event2</code> to a channel.</p><blockquote id="53f3"><p><i>Channels are a type which you can send and receive values, they are great for communication among goroutines. In other words, there are perfect for sending and receive event through your application.</i></p></blockquote><div id="ffd1"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">eventSender</span><span class="hljs-params">(c <span class="hljs-keyword">chan</span> EventType)</span></span> {</pre></div><div id="7f57"><pre> for { // Send <span class="hljs-selector-tag">a</span> random event <span class="hljs-selector-tag">to</span> the channel rand<span class="hljs-selector-class">.Seed</span>(<span class="hljs-selector-tag">time</span><span class="hljs-selector-class">.Now</span>()<span class="hljs-selector-class">.Unix</span>()) events := []EventType{ event1, event2, } n := rand.<span class="hljs-built_in">Int</span>() % <span class="hljs-built_in">len</span>(events)</pre></div><div id="6101"><pre> c <- events[n] <span class="hljs-comment">// send event to channel</span></pre></div><div id="5285"><pre> // <span class="hljs-keyword">wait</span> a <span class="hljs-built_in">bit</span> <span class="hljs-built_in">time</span>.Sleep(<span class="hljs-number">2</span> * <span class="hljs-built_in">time</span>.Second) } }</pre></div><h2 id="000c">Handler and dispatcher</h2><p id="e562">We first need a struct to hold the list of events we want to listen to and which function to call whenever that event is transmitted. This struct also contains the channel used for communicating events.</p><div id="280d"><pre><span class="hljs-comment">// Create a struct to hold config</span> <span class="hljs-comment">// And simplify dependency injections</span> <span class="hljs-keyword">type</span> EventHandler <span class="hljs-keyword">struct</span> { <span class="hljs-comment">// Event channel</span> Events <span class="hljs-keyword">chan</span> Event <span class="hljs-comment">// hold the registedred event functionss</span> EventMap <span class="hljs-keyword">map</span>[EventType][]<span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(Event)</span></span> }</pre></div><p id="aa6c">Next, we need to provide an initializing constructor for our <code>EventHandler</code>.</p><div id="a4ed"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-title">NewEventHandler</span><span class="hljs-params">()</span></span> *EventHandler { eventMap := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">map</span>[EventType][]<span class="hljs-function"><span class="hljs-keyword">func</span><span class="hljs-params">(Event)</span></span>) event

Options

s := <span class="hljs-built_in">make</span>(<span class="hljs-keyword">chan</span> Event)</pre></div><div id="78bb"><pre> return <span class="hljs-variable">&</span>EventHandler<span class="hljs-punctuation">{</span> <span class="hljs-symbol"> Events:</span> events, <span class="hljs-symbol"> EventMap:</span> eventMap, <span class="hljs-punctuation">}</span> <span class="hljs-punctuation">}</span></pre></div><p id="98fe">Then, we can create our <code>Handle</code> function that associates the event with a callback function.</p><div id="308c"><pre><span class="hljs-comment">// register the handler function to handle an event type</span> func (h *EventHandler) <span class="hljs-built_in">Handle</span>(e EventType, f <span class="hljs-built_in">func</span>(Event)) { h<span class="hljs-selector-class">.EventMap</span><span class="hljs-selector-attr">[e]</span> = <span class="hljs-built_in">append</span>(h<span class="hljs-selector-class">.EventMap</span><span class="hljs-selector-attr">[e]</span>, f) }</pre></div><p id="e42a">Finally, we create the <code>EventDispatcher</code> function, the core of this mechanism. The <code>EventDispatcher</code>process any event sent to a channel, check its type, and if any function has been registering for that type, we call all registered functions.</p><div id="6597"><pre><span class="hljs-function"><span class="hljs-keyword">func</span> <span class="hljs-params">(h *EventHandler)</span></span> EventDispatcher() { <span class="hljs-keyword">for</span> evt := <span class="hljs-keyword">range</span> h.Events { log.Printf(<span class="hljs-string">"event recieved: %v"</span>, evt) <span class="hljs-keyword">if</span> handlers, ok := h.EventMap[evt.Type]; ok { <span class="hljs-comment">// If we registered an event</span> <span class="hljs-keyword">for</span> _, f := <span class="hljs-keyword">range</span> handlers { <span class="hljs-comment">// exacute function as goroutine</span> <span class="hljs-keyword">go</span> f(evt) } } } }</pre></div><h1 id="13e4">Using our system</h1><p id="4d4e">Everything is ready; we can start using our event handling system.</p><ol><li>Instantiate our event Handler</li><li>Register which event to listen to and what function to callback</li><li>Start the event sender</li><li>Start the event dispatcher</li></ol><div id="62ab"><pre><span class="hljs-keyword">func</span> <span class="hljs-title function_">main</span><span class="hljs-params">()</span> {</pre></div><div id="5b09"><pre> <span class="hljs-variable">eventHandler</span> := <span class="hljs-function"><span class="hljs-title">NewEventHandler</span>()</span></pre></div><div id="d244"><pre> eventHandler.Handle(event1, <span class="hljs-keyword">func</span><span class="hljs-params">()</span> { <span class="hljs-built_in">log</span>.Printf(<span class="hljs-string">"event Handled: %v"</span>, event1) })</pre></div><div id="5c56"><pre> <span class="hljs-variable">go</span> <span class="hljs-function"><span class="hljs-title">eventSender</span>(<span class="hljs-variable">eventHandler.Events</span>)</span></pre></div><div id="30f2"><pre> eventHandler<span class="hljs-selector-class">.EventDispatcher</span>()</pre></div><div id="9bf2"><pre>}</pre></div><p id="e590">The result should be along those lines:</p><figure id="5ee7"><img src="https://cdn-images-1.readmedium.com/v2/resize:fit:800/1*_D-GCRSu3K8CgTBXewJjJQ.gif"><figcaption></figcaption></figure><p id="19d6">Since we only handle an event of type <code>event1</code>, only <code>event1</code> shows as <code>Hansled</code>. All is good!</p><p id="d48a">The full code for this article can be found <a href="https://github.com/xNok/slack-go-demo-socketmode/blob/main/examples/middleware/main.go">here</a>.</p><h1 id="6f5e">Interesting Articles tackling the same topic</h1><ul><li><a href="https://drstearns.github.io/tutorials/gomiddleware/">Middleware Patterns in Go</a></li><li><a href="https://sathishvj.medium.com/web-handlers-and-middleware-in-golang-2706c2ecfb75">Web Handlers and Middleware in GoLang</a></li><li><a href="https://readmedium.com/lightweight-event-management-implemented-by-go-a654d59ac65">Lightweight event management implemented by Go</a></li><li><a href="https://readmedium.com/the-7-most-important-software-design-patterns-d60e546afb0e">The 7 Most Important Software Design Patterns</a></li></ul><p id="13e7"><i>Do you want <b>unlimited access</b> to all my content and many other writers’ content on Medium? Consider using my affiliate link to <a href="https://couedeloalexandre.medium.com/membership">become a Medium member today</a></i></p><h2 id="853a">Further reads</h2> <figure id="81d2"> <div> <div> <img class="ratio" src="http://placehold.it/16x9"> <iframe class="" src="https://couedeloalexandre.medium.com/embed/list/3f9d03f2cb8f" allowfullscreen="" frameborder="0" height="184" width="undefined"> </div> </div> </figure></iframe></div></div></figure></article></body>

Ways to Stop Other People’s Demons from Becoming Your Own

Don’t be blinded to your own self-worth by others’ negative comments

Image by Alexas_Fotos on Pixabay

When Mahatma Gandhi says, “I will not let anyone walk through my mind with their dirty feet,” he’s exhibiting a mental strength that many of us simply don’t have.

Everyday most of us let someone “walk through [our] minds” with their words and actions. For example, we listen to others’ opinions on our looks, choices, and behaviors, and then we turn them into cold hard facts our brains (and hearts) believe. But it doesn’t stop there. We hear their statements and then subconsciously read between the lines, our self-concept transforming not only through the words themselves, but through their pauses, facial expressions, and body language.

And because of the sad fact that most of us already have self-esteem issues and are conditioned to believe the worst about ourselves, others’ words imprint themselves on our psyches and create stains that won’t go away no matter how hard we try to erase them. We become doormats where everyone’s negative statements get stuck in the fibers of our consciousness.

And to be honest, I don’t think there’s a way to completely stop this chain of events. No matter what others may say about their iron-clad confidence, I don’t believe them. Yes, they may be more self-assured than the majority, but the old adage that “sticks and stones may break my bones, but words will never hurt me” is a bold-faced lie.

So the question is, how do we stop these “dirty feet” from doing irreversible damage? Here are some ways we can lessen their impact.

Seek to understand the people whose hurt you

The majority of people’s words and actions are never really about you. Instead, their behaviors stem from their own emotional baggage and unfulfilled needs.

That coworker who belittles every idea you have or refuses to listen to your suggestions on a work related issue? Their reactions are most likely due to their own own insecurity about their job performance or their jealousy about the recognition you have received for your accomplishments.

Their behavior may even be a result of their personal lives. For example, they may feel powerless in their relationships with spouses or other family members, so they decide to be unyielding or overly aggressive at work.

That’s why it’s so important to recognize these people’s negative responses towards you are a result of their own inner demons, not a flaw in your own performance or personality.

What about the friend who downplays all your successes, criticizes every person you date, or tells you your goals are impossible? Maybe they’re upset at themselves for not working to achieve their own personal ambitions. Maybe they’re jealous you believe in the possibility your aspirations can come true when they have given up hope on fulfilling their own passions and desires. Maybe they simply feel alone or incapable of finding a relationship partner.

And the wounding words of your spouse or significant other? They could be due to the fact that they’re feeling unloved or insecure in their relationship with you. Maybe they’re struggling with wounds or scars from previous partnerships. And because these are the people with whom you share the most time, their toxic treatment could be related to negative interactions with people on the job, family and friends, or anyone they meet during the day.

The point is, when you start to believe that these people’s psychological bullets are a true reflection of your own self-worth, you need to remind yourself that it’s their problems with themselves that are likely the culprit behind their words. This is why you should never accept their comments as valid ones.

Walk away when changing the situation is beyond your control

There are some people’s “dirty feet” that we actually invite into our inner world. Toxic people we call “negative Nancy’s” or “emotional vampires.” Narcissists and abusers whose only goal is to make themselves feel better and make us hurt as badly as they do. And not only do we let them into our world, we make them the most important people in our lives. Our husbands. Our wives. Our “best friends.”

Why do we do this?

Perhaps because their dirty feet have made us believe we are not worthy. The lasting impact of their words and actions make us believe we are damaged goods, that no one else would want us or love us , that the only option is to continue the relationship because, well, at least they’re there with us, right?

Wrong.

I promise you (and it’s a promise I can keep) that there are people who will love you the way you need to be loved. There are people who will build you up instead of tearing you down.

So when the verbal abuse or mistreatment by these people becomes an everyday occurrence, you can walk away. You can leave. And yes, it will be hard. You’ll feel exposed, alone, and scared. But over time, the emotional stains these people have left on your heart will start to fade away. You will begin to heal and rebuild your self-esteem and your battered ego.

This is not to say that the occasional ugly comment or lashing out of a person whom you are close to means you should abandon ship and sever all ties. No one is immune to bad days where we say or do the wrong things to someone we care about. But trust your instincts. Trust your past history with this person. You know deep down whether or not a person’s poisonous actions or words towards you will continue.

And don’t go on believing that you can “fix” these people. They have issues that only they can overcome, and nothing you do will likely make a difference until they choose to do the work they need to do on themselves.

The bottom line:

Author John Mark Green says that “toxic people attach themselves like cinder blocks tied to your ankles, and then invite you for a swim in their poisoned waters.” So, accept that the waters are poison, and then step away from the shore. There are better bodies of water to swim in, and you deserve the opportunity to test them out.

If you enjoyed reading, you may also like:

Relationships
Self
Mindfulness
Advice
Mental Health
Recommended from ReadMedium