avatarTRAVEL STORIES BY GABE

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>

Travel. World. Travel Tips.

My Top 5 Favorite Places in the World (So Far)

And why you should visit them.

Art by Marianne Botero

Traveling is, without a shadow of a doubt, my number one favorite thing to do. I’ve been to thousands of incredible places all around the world, and they all surprised me with something new and fascinating. But, although visiting these places allowed me to live something unique, it doesn’t exclude the fact that I have my top favorite places in the world. When I tell people I’ve traveled to 18 different countries, the first question they ask me is which one is my favorite. So here is a list of my top 5 favorite places in the world and why they blew me away.

5- Iguaçu Falls, Brazil

Photo by Gabriel Morse

Just by looking at this photo above, you can already suppose why it’s one of my favorite places in the world. Cataratas Do Iguacu is one of the Seven Natural Wonders Of The World, and it is located in the state of Parana, Brazil and it borders Argentina. I was blessed enough to spend my 22nd birthday there. It’s until to this day my favorite birthday memory. This place is so beautiful and unique. In 2019 I traveled to Niagara Falls, and though it’s also a pretty gorgeous fall, I can’t deny the fact that it’s not as fascinating and breathtaking as the Iguacu Falls is. At Niagara Falls you see it. Iguacu Falls, you feel it. This is why it’s on my list, and I highly encourage you to visit it one day.

4- Rome, Italy

Photo by Gabriel Morse

The stunning architecture, the hospitable people, the delicious and unique cuisine. Rome is one of the most incredible places I’ve ever been to. I went there during the summer of 2019, and I simply loved it. Do you know those places that exceed your expectations? Rome was the one place that certainly made me experience more than I expected. I can’t stress enough how wonderful its buildings, monuments and incredible works of art are. There’s this small-town charm, and vibe I often have a hard time trying to put into words. Rome is a must for every world traveler.

3- London, England

Photo by Gabriel Morse

London is probably the place I see myself living for the rest of my life. It’s so incredible to see the modern and ancient buildings as you walk everywhere. The way the city is so multicultural inspires me. London has more than 100 nationalities. London’s vibrant culture is this melting pot of cultures, nationalities, and languages. From history and culture to fine food and exceedingly good times London has everything. I found the people there a lot more approachable and hospitable than I expected them to be, and the pubs are just amazing places you find yourself at with your friends at the end of the day.

2- New York City, USA

Photo by Sharon Lakeman

Ah, New York! The city that never sleeps. The city in which the lights will inspire you to strive for greatness. The place where you make all your dreams come true. The city offers every single traveler (and resident) the chance to be their best self no matter what. New York City is unbelievably unique. I just love it there so much. I’m so glad I not only had the chance to visit it but to live there. If I had to give you all the reasons why it’s my second favorite place in the whole world I would need to write a book. NYC has so much to offer. From eating their delicious Pizza and Bagels to watching a talented musician perform on a subway, New York City surprises everyone everywhere. I had never felt as free and happy as I’ve felt in New York City. You can wear anything and people won’t judge you. Diversity is celebrated in every corner of this city, and that is something I haven’t seen as much anywhere else in the world.

1- Arraial Do Cabo, Brazil.

Photo by Gabriel Morse

There is so much beauty in this place that I can’t even try to describe. Arraial Do Cabo is my number one favorite city in the world for a wide variety of reasons. Natural sculptures are everywhere and they are so beautiful. Nautical tourism is one of the region’s biggest treasures. Ilha do Farol, which is located in Arraial do Cabo, is part of the Biosphere Reserve (by Unesco). It is the preferred destination for boat trips, which is justified by the surroundings full of beautiful sculptures. It was elected as the most perfect beach in Brazil and, no wonder that the city of Arraial do Cabo is one of the most sought after by national tourists. The water is abundantly clear and beautiful.

Photo by Gabriel Morse

In addition to the natural beauty, there is an inestimable historical value as it was one of the first points seen by the Portuguese at the time they arrived in Brazil. I find so much peace and connection with this place. Before I moved to the U.S. I used to go there almost every weekend (even though I lived 10 hours away from it). Yes, I would drive that much just to be able to step my feet onto those clean and white sands, dive into the beautiful water, and appreciate the beauty God created. The beaches are so preserved there. You don’t see buildings and pollution anywhere. You just see nature. You breathe in nature and you feel alive.

Photo by Gabriel Morse

I remember I’d take my best friends there with me, we would rent boats and just spend the day out on the sea. I love it so much, and I can’t wait to be back. I’ve been to several beaches in the Caribbean, like The Bahamas, Cancun, the Dominican Republic. I’ve been to Miami Beach, California beaches, the Mediterranean Sea, and a couple of beaches in Italy, and none of them have topped Arraial Do Cabo. They all have beauty, but Arraial has a glorious and heavenly beauty that I have not been able to find anywhere else. If you ever have the chance to visit it, don’t hesitate to do so. You won’t regret it.

Photo by Gabriel Morse

Thank you so much for reading my article today.

Follow me on Medium so you don’t miss any of my stories.

Sign up for our newsletter to stay informed with up-to-date curations from our editors:👇

We now offer exclusive writing services for our members. Discover how you can take advantage of our editing services and more.

Travel Stories
Travel
Travel Writing
Places To Visit
Travel Tips
Recommended from ReadMedium