<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TutorialEdge.net</title><link>https://tutorialedge.net/</link><description>Recent content on TutorialEdge.net</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Sat, 20 Jun 2026 12:00:00 +0000</lastBuildDate><atom:link href="https://tutorialedge.net/index.xml" rel="self" type="application/rss+xml"/><item><title>Part 1 - Project Setup and Your First Window</title><link>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-1-project-setup-and-first-window/</link><pubDate>Fri, 29 May 2026 10:01:00 +0000</pubDate><guid>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-1-project-setup-and-first-window/</guid><description>&lt;p&gt;Welcome to the first part of this series on graphics programming with wgpu in Rust! By the end of this article, you&amp;rsquo;ll have a Rust program that opens a window and responds to input events. It doesn&amp;rsquo;t draw anything yet, but it&amp;rsquo;s the skeleton that everything else will hang from.&lt;/p&gt;
&lt;h2 id="what-is-wgpu"&gt;
 &lt;a href="#what-is-wgpu" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is wgpu?&lt;/h2&gt;
&lt;p&gt;wgpu is a Rust graphics library that talks to your GPU using whichever native API your platform provides — Vulkan on Linux, Metal on macOS, DirectX 12 on Windows, and WebGPU in the browser. You write one codebase and it runs everywhere.&lt;/p&gt;</description></item><item><title>Part 1 - Project Setup &amp; Your First HTTP Proxy</title><link>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-1-project-setup-and-first-proxy/</link><pubDate>Fri, 20 Mar 2026 10:01:00 +0000</pubDate><guid>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-1-project-setup-and-first-proxy/</guid><description>&lt;p&gt;Welcome to the first part of this series on building an API gateway in Rust! By the end of this tutorial, you&amp;rsquo;ll have a working reverse proxy that accepts incoming HTTP requests and forwards them to a backend server. It&amp;rsquo;s a surprisingly small amount of code, and it&amp;rsquo;ll give us a solid foundation to build on.&lt;/p&gt;
&lt;h2 id="what-is-a-reverse-proxy"&gt;
 &lt;a href="#what-is-a-reverse-proxy" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is a Reverse Proxy?&lt;/h2&gt;
&lt;p&gt;Before we write any code, let&amp;rsquo;s make sure we&amp;rsquo;re on the same page about what a reverse proxy actually does.&lt;/p&gt;</description></item><item><title>Security in Go - Building a Port Scanner in Go</title><link>https://tutorialedge.net/projects/building-security-tools-in-go/building-port-scanner-go/</link><pubDate>Sat, 15 Feb 2020 15:06:51 +0000</pubDate><guid>https://tutorialedge.net/projects/building-security-tools-in-go/building-port-scanner-go/</guid><description>&lt;p&gt;Welcome to the first tutorial in this new series on building security tools in Go! In this tutorial, we are going to be building a very cool port scanner which you will be able to point at a server and probe for any potential vulnerabilities.&lt;/p&gt;
&lt;p&gt;This will give us a good understanding of what Port Scanning is and why we should be aware of what ports we are leaving open on any of the machines that we run our applications on top of.&lt;/p&gt;</description></item><item><title>Part 1 - Project Setup</title><link>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-1-project-setup/</link><pubDate>Mon, 23 Dec 2019 18:44:50 +0100</pubDate><guid>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-1-project-setup/</guid><description>&lt;p&gt;In the first part of this tutorial series, we are going to be working on project setup for both the frontend and the backend of the Imgur image-hosting clone that we are going to be building.&lt;/p&gt;
&lt;p&gt;By the end of this section, you will have two separate projects that built using the &lt;code&gt;vue&lt;/code&gt; cli for our frontend Vue.js application and the &lt;code&gt;npm&lt;/code&gt; cli for our backend Node.js REST API that will be powering our frontend.&lt;/p&gt;</description></item><item><title>Challenge 01 - Type Assertions in Go</title><link>https://tutorialedge.net/challenges/go/type-assertions/</link><pubDate>Sun, 24 Nov 2019 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/challenges/go/type-assertions/</guid><description>&lt;p&gt;In this challenge, we are going to become familiar with the concept of &lt;code&gt;Type Assertions&lt;/code&gt; in Go!&lt;/p&gt;
&lt;h2 id="preface"&gt;
 &lt;a href="#preface" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Preface&lt;/h2&gt;
&lt;p&gt;If you are new to the language, then type assertions are a concept that can sometimes trip you up and appear a little tricky at first, but after overcoming the syntax it becomes far easier to understand.&lt;/p&gt;
&lt;p&gt;Through using type assertions, we can retrieve the &lt;em&gt;dynamic value&lt;/em&gt; of an interface. For example:&lt;/p&gt;</description></item><item><title>Getting Started With Go</title><link>https://tutorialedge.net/golang/getting-started-with-go/</link><pubDate>Sat, 22 Sep 2018 15:23:16 +0100</pubDate><guid>https://tutorialedge.net/golang/getting-started-with-go/</guid><description>&lt;p&gt;Go is an absolutely incredible language for building a wide variety of different
applications. From command-line interfaces to distributed microsystems and
even cloud platforms, its simplicity and concurrency baked in make it a
powerful choice of language for many development teams.&lt;/p&gt;
&lt;p&gt;In this tutorial, I will be embarking on a mission to help get you up and
running with the language so that you can go off and build ever-more brilliant
applications and help push forward technology.&lt;/p&gt;</description></item><item><title>Designing the EveryNote Web App with Vue.js and Vuex</title><link>https://tutorialedge.net/javascript/vuejs/designing-everynote-app-vuejs-vuex/</link><pubDate>Fri, 27 Jul 2018 19:36:57 +0100</pubDate><guid>https://tutorialedge.net/javascript/vuejs/designing-everynote-app-vuejs-vuex/</guid><description>&lt;p&gt;In this article, you’ll learn to develop an application to take notes, called
&lt;code&gt;EveryNote&lt;/code&gt;, from scratch. You’ll analyze and design the application, as well as
preparing the folder structure for the project. After that, you’ll build the
application incrementally through tests and code, providing a real-world Vuex
development example.&lt;/p&gt;
&lt;p&gt;The application can be downloaded by cloning the
&lt;a href="https://github.com/PacktPublishing/-Vuex-Condensed"
 title="https://github.com/PacktPublishing/-Vuex-Condensed" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 https://github.com/PacktPublishing/-Vuex-Condensed&lt;/a&gt;
Git repository. You’ll require Node.js installed on a system. Finally, to use
the Git repository, the user needs to install Git. The code files of this
article can be found on GitHub:
&lt;code&gt;https://github.com/PacktPublishing/Vuex-Quick-Start-Guide/tree/master/chapter-4&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Form Validation With Vuelidate in Vue.js</title><link>https://tutorialedge.net/javascript/vuejs/form-validation-with-vuelidate-vuejs/</link><pubDate>Thu, 07 Jun 2018 19:36:57 +0100</pubDate><guid>https://tutorialedge.net/javascript/vuejs/form-validation-with-vuelidate-vuejs/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Learn how to validate forms using Vuelidate in this tutorial by Paul Halliday,
the author of
&lt;a href="https://amzn.to/2JjyXiT"
 title="Vue.js 2 Design Patterns and Best Practices" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Vue.js 2 Design Patterns and Best Practices&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this post, you&amp;rsquo;ll use a third-party library named Vuelidate to perform model
validation depending on a particular rule set&lt;/p&gt;
&lt;h2 id="create-a-new-vue-project"&gt;
 &lt;a href="#create-a-new-vue-project" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Create a New Vue Project&lt;/h2&gt;
&lt;p&gt;Create a playground project by running the following in your Terminal:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;## Create a new Vue project&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; vue init webpack&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;simple vue&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;validation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;## Navigate to directory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; cd vue&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;validation
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;## Install dependencies&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; npm install
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;## Install Vuelidate&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; npm install vuelidate
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;## Run application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; npm run dev
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="what-is-vuelidate"&gt;
 &lt;a href="#what-is-vuelidate" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is Vuelidate?&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Vuelidate&lt;/code&gt; is an open source, lightweight library that helps you perform model
validation with a variety of validation contexts. Validation can be functionally
composed and it also works well with other libraries such as &lt;code&gt;Moment&lt;/code&gt;, &lt;code&gt;Vuex&lt;/code&gt;,
and more. As you&amp;rsquo;ve installed it in your project with &lt;code&gt;npm install vuelidate&lt;/code&gt;,
you now need to register it as a plugin within main.js:&lt;/p&gt;</description></item><item><title>Managing State With Vuex in Vue.js</title><link>https://tutorialedge.net/javascript/vuejs/managing-state-with-vuex-vuejs/</link><pubDate>Sat, 31 Mar 2018 19:06:13 +0100</pubDate><guid>https://tutorialedge.net/javascript/vuejs/managing-state-with-vuex-vuejs/</guid><description>&lt;p&gt;State management is something you will ultimately have to deal with as you
create increasingly complex frontend applications. Thankfully, with the help of
Vuex, this isn&amp;rsquo;t as hard as you may think!&lt;/p&gt;
&lt;h2 id="installation"&gt;
 &lt;a href="#installation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Installation&lt;/h2&gt;
&lt;p&gt;In order to install &lt;code&gt;vuex&lt;/code&gt;, you will have to use either &lt;code&gt;yarn&lt;/code&gt; or &lt;code&gt;npm&lt;/code&gt; like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;## Npm&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; npm install vuex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;## Yarn&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; yarn add vuex
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="setting-up-vuex"&gt;
 &lt;a href="#setting-up-vuex" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Setting up Vuex&lt;/h2&gt;
&lt;p&gt;Once you have successfully installed Vuex in your VueJS application, you can set
your application to use it by doing the following within your &lt;code&gt;main.js&lt;/code&gt; file:&lt;/p&gt;</description></item><item><title>Part 1 - Setting Up Our CI/CD Pipeline to S3</title><link>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-1-hosting-on-s3/</link><pubDate>Mon, 19 Mar 2018 16:24:13 +0000</pubDate><guid>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-1-hosting-on-s3/</guid><description>&lt;p&gt;If you know anything about me, you&amp;rsquo;ll know I am incredibly lazy. This means that
it&amp;rsquo;s incredibly important to set up an automated deployment pipeline early in
the project&amp;rsquo;s development.&lt;/p&gt;
&lt;p&gt;If we are serious about developing a decent website that will make us tonnes of
money then we need to get this working from the start. Afterall, if it takes us
about 5-10 minutes to deploy our site, by automating this we&amp;rsquo;ll be saving
ourselves 5-10 minutes every time we wish to push up changes.&lt;/p&gt;</description></item><item><title>Part 1 - Initial Setup</title><link>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-1-initial-setup/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-1-initial-setup/</guid><description>&lt;p&gt;We&amp;rsquo;ll start off this course by setting up both of our projects. Once we&amp;rsquo;ve got
the fairly boring setup out of the way, we can begin to add new functionality
and build up our application and see some positive results!&lt;/p&gt;
&lt;h2 id="goals"&gt;
 &lt;a href="#goals" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Goals&lt;/h2&gt;
&lt;p&gt;By the end of this part of the tutorial series, you will have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Created the basic Go application within a &lt;code&gt;backend/&lt;/code&gt; directory.&lt;/li&gt;
&lt;li&gt;Created a basic ReactJS application within a &lt;code&gt;frontend/&lt;/code&gt; directory.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With both of these achieved, you will then be able to start adding functionality
to your real-time chat system in the following parts of the course.&lt;/p&gt;</description></item><item><title>Getting Started With Vue.js</title><link>https://tutorialedge.net/javascript/vuejs/getting-started-with-vuejs/</link><pubDate>Wed, 28 Feb 2018 20:27:49 +0000</pubDate><guid>https://tutorialedge.net/javascript/vuejs/getting-started-with-vuejs/</guid><description>&lt;p&gt;In this tutorial, we are going to look at how you can setup your development
environment so that you can get started writing your own VueJS.&lt;/p&gt;
&lt;p&gt;We will be utilizing the &lt;code&gt;vue-cli&lt;/code&gt; in order to start our project off and then
we&amp;rsquo;ll be diving in and making a few edits, before finally building it using the
same &lt;code&gt;vue-cli&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;div style="position:relative;height:0;padding-bottom:56.3%"&gt;&lt;iframe src="https://www.youtube.com/embed/ac5asCHm1G8?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="639" height="360" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id="a-simple-vue-app"&gt;
 &lt;a href="#a-simple-vue-app" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;A Simple Vue App&lt;/h2&gt;
&lt;p&gt;Before I get started, it must be noted that you can get up and running really
quickly with VueJS 2 in less than 30 lines of code. Below you will find a
webpage that is a very simple VueJS page that simply prints out &lt;code&gt;Hello World&lt;/code&gt; to
the browser when hit.&lt;/p&gt;</description></item><item><title>Getting Started With Python</title><link>https://tutorialedge.net/python/getting-started-with-python/</link><pubDate>Mon, 18 Sep 2017 19:47:29 +0100</pubDate><guid>https://tutorialedge.net/python/getting-started-with-python/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial uses Python version 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this course we’ll be taking a look at the absolute basics of the Python
programming language and cover everything you need to get up and running
creating your own basic Python programs.&lt;/p&gt;
&lt;p&gt;The full text version of this course can be found by clicking on the Python
Programming Course card on the homepage of my site.&lt;/p&gt;
&lt;h2 id="installing-python"&gt;
 &lt;a href="#installing-python" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Installing Python&lt;/h2&gt;
&lt;p&gt;Let’s dive in. So before we can get started working with the Python programming
language you’ll first need to install the latest version of Python onto your
local development machine. For the purpose of this video series we shall be
using version 3.6.2.&lt;/p&gt;</description></item><item><title>An Introduction To Web Development</title><link>https://tutorialedge.net/webdev/introduction-to-web-development/</link><pubDate>Sun, 16 Apr 2017 17:27:53 +0100</pubDate><guid>https://tutorialedge.net/webdev/introduction-to-web-development/</guid><description>&lt;p&gt;Since it&amp;rsquo;s inception in the 90s the web has seen an explosion in the number and
range of different web technologies used for building websites. However, if you
have never created a website in your life then this can all be very daunting and
initially offputting for someone wanting to take the plunge and get into web
development seriously. In this introductory guide I&amp;rsquo;ll be helping to demystify
some of the key terms and concepts that every web developer should know or be
aware of.&lt;/p&gt;</description></item><item><title>Part 2 - The Render Pipeline</title><link>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-2-the-render-pipeline/</link><pubDate>Fri, 29 May 2026 10:02:00 +0000</pubDate><guid>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-2-the-render-pipeline/</guid><description>&lt;p&gt;In &lt;a href="./projects/graphics-with-wgpu-in-rust/part-1-project-setup-and-first-window/"
 title="Part 1" 
 &gt;
 Part 1&lt;/a&gt; we opened a window. In this part, we connect that window to the GPU and draw our first frame — a solid colour fill. It&amp;rsquo;s a modest result, but it means the full rendering pipeline is working end-to-end.&lt;/p&gt;
&lt;h2 id="how-the-gpu-pipeline-works"&gt;
 &lt;a href="#how-the-gpu-pipeline-works" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;How the GPU Pipeline Works&lt;/h2&gt;
&lt;p&gt;Before writing code, here&amp;rsquo;s the mental model you need.&lt;/p&gt;
&lt;p&gt;&lt;img src="./images/wgpu-gpu-pipeline.svg" alt="wgpu GPU pipeline diagram" /&gt;&lt;/p&gt;
&lt;h3 id="cpu-side-recording-commands"&gt;
 &lt;a href="#cpu-side-recording-commands" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;CPU side: recording commands&lt;/h3&gt;
&lt;p&gt;The CPU never tells the GPU to draw a single pixel directly. Instead it &lt;em&gt;records&lt;/em&gt; a list of operations into a &lt;strong&gt;command encoder&lt;/strong&gt; — think of it as building a script to hand off. That script captures one or more &lt;strong&gt;render passes&lt;/strong&gt;, each of which describes what to draw and where to write the results.&lt;/p&gt;</description></item><item><title>Part 2 - Routing &amp; Path Matching</title><link>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-2-routing-and-path-matching/</link><pubDate>Fri, 20 Mar 2026 10:02:00 +0000</pubDate><guid>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-2-routing-and-path-matching/</guid><description>&lt;p&gt;In the &lt;a href="./projects/building-api-gateway-in-rust/part-1-project-setup-and-first-proxy/"
 title="previous tutorial" 
 &gt;
 previous tutorial&lt;/a&gt;, we built a basic reverse proxy that forwards all requests to a single backend server. That&amp;rsquo;s a good start, but a real API gateway needs to route requests to different services based on the URL path.&lt;/p&gt;
&lt;p&gt;For example, requests to &lt;code&gt;/api/users&lt;/code&gt; might go to a user service on port 8081, while requests to &lt;code&gt;/api/orders&lt;/code&gt; go to an order service on port 8082. This is the bread and butter of what an API gateway does.&lt;/p&gt;</description></item><item><title>Defining the Comment Service</title><link>https://tutorialedge.net/courses/go-rest-api-course/07-defining-comment-service/</link><pubDate>Sat, 13 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/07-defining-comment-service/</guid><description>&lt;p&gt;Now that we have our database setup, we have everything we need to start implementing our comment service and build it in a test-driven way.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll start off by defining the interface for our comment service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; comment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/jinzhu/gorm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Service - our comment service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Service &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	DB &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;gorm&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// CommentService -&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; CommentService &lt;span style="color:#81a1c1;font-weight:bold"&gt;interface&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// NewService - returns a new comments service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;NewService&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;db &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;gorm&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DB&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Service &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;Service&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		DB&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; db&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, we&amp;rsquo;ll need to define the methods that we want to be part of this service and we&amp;rsquo;ll also need to define the struct for our Comment object:&lt;/p&gt;</description></item><item><title>Handling JSON</title><link>https://tutorialedge.net/courses/go-rest-api-course/11-handling-json/</link><pubDate>Sat, 13 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/11-handling-json/</guid><description>&lt;p&gt;Now, at present we don&amp;rsquo;t currently handle JSON and we don&amp;rsquo;t return JSON from our API, so it&amp;rsquo;s not exactly what you would call a JSON REST API just yet. So, in this video, we are going to look at how you can effectively work with JSON and encode and decode JSON within the transport package.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;So, let&amp;rsquo;s open up the &lt;code&gt;handler.go&lt;/code&gt; file within the transport package. The first thing we are going to improve is the API health check endpoint and instead of returning a simple string, we are instead going to change this to return a JSON response.&lt;/p&gt;</description></item><item><title>Implementing Our Repository Layer</title><link>https://tutorialedge.net/courses/go-rest-api-course/06-implementing-db-package/</link><pubDate>Sat, 13 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/06-implementing-db-package/</guid><description>&lt;p&gt;Now that our Postgres DB is up and running, we now have to implement the package that we&amp;rsquo;ll use to communicate to this database.&lt;/p&gt;
&lt;p&gt;Create a new directory within your &lt;code&gt;internal&lt;/code&gt; directory called &lt;code&gt;database&lt;/code&gt;. Within that create a new file called &lt;code&gt;database.go&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; database
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/jinzhu/gorm&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	_ &lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/jinzhu/gorm/dialects/postgres&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// NewDatabase - returns a pointer to a new database connection&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;NewDatabase&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;gorm&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DB&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, within the &lt;code&gt;NewDatabase&lt;/code&gt; function, we&amp;rsquo;ll want to setup a connection and then ping that connection to ensure it&amp;rsquo;s working as intended.&lt;/p&gt;</description></item><item><title>Implementing The Comment REST API Endpoints</title><link>https://tutorialedge.net/courses/go-rest-api-course/09-implementing-http-endpoints/</link><pubDate>Sat, 13 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/09-implementing-http-endpoints/</guid><description>&lt;p&gt;In this video, we&amp;rsquo;ll be defining the HTTP endpoints that are effectively going to expose the our comment service.&lt;/p&gt;</description></item><item><title>Implementing the Comment Service</title><link>https://tutorialedge.net/courses/go-rest-api-course/08-defining-comment-service-part-2/</link><pubDate>Sat, 13 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/08-defining-comment-service-part-2/</guid><description>&lt;p&gt;So now that we&amp;rsquo;ve defined our comment service interface, let&amp;rsquo;s set about actually implementing the methods that we&amp;rsquo;ve defined.&lt;/p&gt;
&lt;h2 id="getting-a-comment-by-id"&gt;
 &lt;a href="#getting-a-comment-by-id" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Getting a Comment By ID&lt;/h2&gt;
&lt;p&gt;So let&amp;rsquo;s start off by defining the &lt;code&gt;GetComment&lt;/code&gt; method.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// GetComment - retrieves comments by their ID from the database&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Service&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;GetComment&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;ID &lt;span style="color:#81a1c1"&gt;uint&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;Comment&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; comment Comment
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; result &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; s&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DB&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;First&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;comment&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; ID&lt;span style="color:#eceff4"&gt;);&lt;/span&gt; result&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Error &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; Comment&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; result&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Error
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; comment&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So &lt;code&gt;GetComment&lt;/code&gt; retrieves comments by their ID from the database. We&amp;rsquo;re going to pass in the ID here and then say, if the &lt;code&gt;result.Error&lt;/code&gt; is not nil, then return an empty comment struct. Otherwise, we want to return the comment and a nil error.&lt;/p&gt;</description></item><item><title>Running Postgres Locally with Docker</title><link>https://tutorialedge.net/courses/go-rest-api-course/05-running-postgres-with-docker/</link><pubDate>Sat, 13 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/05-running-postgres-with-docker/</guid><description>&lt;p&gt;In the previous video in this course, we looked at how we could implement the transport package. Now, we are going to take a step back and look at how we can implement the storage layer of this service.&lt;/p&gt;
&lt;p&gt;We need some form of storage system to store all of the comments from our incredible users. Since we know what the structure of our comments will look like, a SQL database is ideal for our situation. As such, we&amp;rsquo;ll be using Postgres to store everything.&lt;/p&gt;</description></item><item><title>Implementing the Transport Package</title><link>https://tutorialedge.net/courses/go-rest-api-course/04-implementing-the-transport-package/</link><pubDate>Sat, 06 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/04-implementing-the-transport-package/</guid><description>&lt;p&gt;So, we have our basic app structure defined, let&amp;rsquo;s start looking at how we can build out the server aspect and start serving some basic endpoints.&lt;/p&gt;
&lt;p&gt;Now that we have some idea as to how we can structure our app, it&amp;rsquo;s time to dive in and start fleshing out some of the basic functionality.&lt;/p&gt;
&lt;p&gt;The first endpoint we&amp;rsquo;ll want to build is a simple health check endpoint that simply returns a status 200 OK if the service is up and healthy. Health checks are important in applications and, if done correctly can quickly return the operational health of your systems and alert you when things go bad.&lt;/p&gt;</description></item><item><title>Connecting to RabbitMQ in Go</title><link>https://tutorialedge.net/courses/go-rabbitmq-crash-course/03-connecting-to-rabbitmq-go/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rabbitmq-crash-course/03-connecting-to-rabbitmq-go/</guid><description>&lt;p&gt;Now that we have our RabbitMQ instance up and running, it&amp;rsquo;s time to start developing applications on top of it.&lt;/p&gt;</description></item><item><title>Consuming Messages from RabbitMQ</title><link>https://tutorialedge.net/courses/go-rabbitmq-crash-course/05-consuming-messages-rabbitmq-go/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rabbitmq-crash-course/05-consuming-messages-rabbitmq-go/</guid><description>&lt;p&gt;So, we&amp;rsquo;ve accomplished quite a lot so far, we&amp;rsquo;ve managed to set up a well structured app that is able to create a queue and subsequently publish messages to this queue.&lt;/p&gt;
&lt;p&gt;In this video, we are going to be focused on how we can do the reverse and consume the messages that we have published to this queue.&lt;/p&gt;</description></item><item><title>Creating Queues and Publishing Messages</title><link>https://tutorialedge.net/courses/go-rabbitmq-crash-course/04-creating-queues-publishing-in-go/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rabbitmq-crash-course/04-creating-queues-publishing-in-go/</guid><description>&lt;p&gt;Let&amp;rsquo;s expand on our RabbitMQ service and add the ability to create queues and publish some messages to these newly created queues.&lt;/p&gt;</description></item><item><title>RabbitMQ Crash Course For Go - Course Overview</title><link>https://tutorialedge.net/courses/go-rabbitmq-crash-course/01-course-overview/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rabbitmq-crash-course/01-course-overview/</guid><description>&lt;p&gt;Welcome Gophers! In this course, we are going to be covering everything you need to know in order to quickly get started developing Go applications on top of RabbitMQ.&lt;/p&gt;</description></item><item><title>Setting up RabbitMQ locally using Docker</title><link>https://tutorialedge.net/courses/go-rabbitmq-crash-course/02-running-rabbitmq-locally/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rabbitmq-crash-course/02-running-rabbitmq-locally/</guid><description>&lt;p&gt;We&amp;rsquo;ll start off our journey setting up a locally running instance of RabbitMQ that we can connect to and base our learnings off for now.&lt;/p&gt;
&lt;p&gt;In order to run this instance we&amp;rsquo;ll be using docker as it affords us a number of advantages such as the ability to quickly teardown and spin up a fresh RabbitMQ instance should we mess anything up or want to start from scratch!&lt;/p&gt;
&lt;p&gt;So, first things first, you will need to ensure you have docker for desktop installed on your machine so that you can startup and run docker containers. Once you have this installed and available on your path open up a terminal and run the following:&lt;/p&gt;</description></item><item><title>Rust Module Tutorial</title><link>https://tutorialedge.net/rust/rust-module-tutorial/</link><pubDate>Sun, 05 Apr 2020 08:53:05 +0100</pubDate><guid>https://tutorialedge.net/rust/rust-module-tutorial/</guid><description>&lt;p&gt;Welcome Rustaceans! In this tutorial, we are going to take a look at Modules in Rust and how you can define your own simple modules.&lt;/p&gt;
&lt;p&gt;By the end of this tutorial, we will have covered:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The absolute basics of modules in Rust&lt;/li&gt;
&lt;li&gt;The rules around defining your own modules&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With this in mind, let&amp;rsquo;s dive in!&lt;/p&gt;
&lt;h2 id="modules-in-rust"&gt;
 &lt;a href="#modules-in-rust" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Modules in Rust&lt;/h2&gt;
&lt;p&gt;When you first start learning Rust coming from another programming language, one of the first problems you typically come up against is - &amp;ldquo;How do I split my code into multiple files?&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Part 2 - Creating Simple Vue.js Components</title><link>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-2-simple-components/</link><pubDate>Sat, 28 Dec 2019 18:44:50 +0100</pubDate><guid>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-2-simple-components/</guid><description>&lt;p&gt;In the previous part of this project series, we scaffolded the basic structure of both the frontend and the backend of our project. Once we were happy that everything was setup correctly, we then created a github repository in which our project now lives.&lt;/p&gt;
&lt;p&gt;With the setup out of the way, we can now start to dive down into developing the frontend and learnings some of the critical, core Vue.js concepts that you&amp;rsquo;ll need in order to succeed as a Vue.js developer.&lt;/p&gt;</description></item><item><title>Challenge 02 - Satisfying Interfaces in Go</title><link>https://tutorialedge.net/challenges/go/interfaces/</link><pubDate>Sun, 24 Nov 2019 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/challenges/go/interfaces/</guid><description>&lt;p&gt;In this challenge, you are going to implement the necessary methods needed to satisfy the provided Go interface.&lt;/p&gt;
&lt;p&gt;On the left hand screen, you have a simple Go application that features an interface called &lt;code&gt;Employee&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In order to complete this challenge, you will have to complete the code and satisfy this interface.&lt;/p&gt;
&lt;p&gt;&lt;Quiz question="Can you implement additional methods for this interface outside of the contract?" correct="A" answer="True" A="True" B="False"&gt;&lt;/Quiz&gt;&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Employee &lt;span style="color:#81a1c1;font-weight:bold"&gt;interface&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;Language&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;Age&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Engineer &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e Engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Age&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b48ead"&gt;26&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e Engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Language&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34; programs in Go&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// This will throw an error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; programmers &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;Employee
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; elliot &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; Engineer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Elliot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// Engineer does not implement the Employee interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// you&amp;#39;ll need to implement Age() and Random()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; programmers &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;programmers&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; elliot&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Further Reading:&lt;/h2&gt;
&lt;p&gt;If you like this challenge then you may also appreciate some of the following articles on the site:&lt;/p&gt;</description></item><item><title>Using RwLock and CondVars in Rust</title><link>https://tutorialedge.net/rust/using-rwlocks-and-condvars-rust/</link><pubDate>Sat, 01 Sep 2018 15:09:49 +0100</pubDate><guid>https://tutorialedge.net/rust/using-rwlocks-and-condvars-rust/</guid><description>&lt;h2 id="read-many-write-exclusive-locks--rwlock"&gt;
 &lt;a href="#read-many-write-exclusive-locks--rwlock" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Read many, write exclusive locks – RwLock&lt;/h2&gt;
&lt;p&gt;Consider a situation where you have a resource that must be manipulated only a
single thread at a time, but is safe to be queried by many—that is, you have
many readers and only one writer.&lt;/p&gt;
&lt;p&gt;While you could protect this resource with a &lt;code&gt;mutex&lt;/code&gt;, the trouble is that the
mutex makes no distinction between its lockers; every thread will be forced to
wait, no matter what their intentions. &lt;code&gt;RwLock&amp;lt;T&amp;gt;&lt;/code&gt; is an alternative to the
mutex concept, allowing for two kinds of locks—read and write. Analogously to
Rust&amp;rsquo;s references, there can only be one write lock taken at a time but multiple
reader locks, exclusive of a write lock. Here’s an example:&lt;/p&gt;</description></item><item><title>Learning Generics in Rust</title><link>https://tutorialedge.net/rust/learning-generics-in-rust/</link><pubDate>Sat, 01 Sep 2018 14:52:49 +0100</pubDate><guid>https://tutorialedge.net/rust/learning-generics-in-rust/</guid><description>&lt;p&gt;Generics are a facility to write code for multiple contexts with different
types, and parameterization allows the programmer to write code that makes fewer
assumptions about the data structures and code segments involved in the code&amp;rsquo;s
definition.&lt;/p&gt;
&lt;p&gt;For example, a very ambiguous concept would be the concept of addition. When a
programmer writes &lt;code&gt;a + b&lt;/code&gt;, what does that mean? In Rust, the &lt;code&gt;Add&lt;/code&gt; trait can be
implemented for just about any type. As long as there is an implementation for
the &lt;code&gt;Add&lt;/code&gt; trait in scope that is compatible with the types of a and b, this
trait will define the operation.&lt;/p&gt;</description></item><item><title>Go Basic Types Tutorial</title><link>https://tutorialedge.net/golang/go-basic-types-tutorial/</link><pubDate>Sat, 14 Jul 2018 22:24:26 +0100</pubDate><guid>https://tutorialedge.net/golang/go-basic-types-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to be looking at all of the basic data types
available to us within the Go language. By the end of this tutorial, you should
be comfortable with the various different types available within the language
and hopefully some understanding as to how you can use these within your own Go
programs.&lt;/p&gt;
&lt;p&gt;This kind of material can be fairly dry and boring to learn so I&amp;rsquo;ll try and
spice things up and make it somewhat interesting whilst also covering the
necessary basics.&lt;/p&gt;</description></item><item><title>Part 2 - Getting Started With AWS Lambda</title><link>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-2-getting-started-with-lambdas/</link><pubDate>Thu, 19 Apr 2018 21:42:29 +0100</pubDate><guid>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-2-getting-started-with-lambdas/</guid><description>&lt;p&gt;So, in the last tutorial, we managed to get a simple CI/CD pipeline up and
running so that whenever we commit anything to our github repo, it automatically
builds and deploys these changes to our &amp;ldquo;production&amp;rdquo; environment.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to continue to develop our blog and get started
building up the first of our Lambda functions that we&amp;rsquo;ll need to make our blog
work.&lt;/p&gt;
&lt;h2 id="our-first-lambda-function"&gt;
 &lt;a href="#our-first-lambda-function" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our First Lambda Function&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ll start by creating a &lt;code&gt;hello world&lt;/code&gt; style lambda function that will later
return a paginated list of blog posts. Once we&amp;rsquo;ve managed to successfully deploy
this version 1 of the endpoint, we can then start working on integrating it with
our DynamoDB table that we&amp;rsquo;ll be creating later on in the series.&lt;/p&gt;</description></item><item><title>Part 2 - Simple Communication</title><link>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-2-simple-communication/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-2-simple-communication/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This post is part 2 of a series on building a chat application in
Go with ReactJS. You can find part 1 here -
&lt;a href="./projects/chat-system-in-go-and-react/part-1-initial-setup/"
 title="Part 1 - Initial Setup" 
 &gt;
 Part 1 - Initial Setup&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, now that we have our basic frontend and backend set up, it&amp;rsquo;s time to
actually do something with them.&lt;/p&gt;
&lt;p&gt;In this part of the series, we&amp;rsquo;ll be implementing a basic WebSocket server which
will listen for messages and write them back to via the same WebSocket.&lt;/p&gt;</description></item><item><title>Vue.js Components Tutorial</title><link>https://tutorialedge.net/javascript/vuejs/vuejs-components-tutorial/</link><pubDate>Thu, 01 Mar 2018 12:26:40 +0000</pubDate><guid>https://tutorialedge.net/javascript/vuejs/vuejs-components-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This Tutorial builds off the starter application that we generated in the
&lt;a href="./javascript/vuejs/getting-started-with-vuejs/"
 title="Getting Started with VueJS" 
 &gt;
 Getting Started with VueJS&lt;/a&gt;
article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;p&gt;This tutorial is also available in video format if you wish to watch it!&lt;/p&gt;
&lt;div style="position:relative;height:0;padding-bottom:42.76%"&gt;&lt;iframe src="https://www.youtube.com/embed/5ounPLpSdeE?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="842" height="360" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this tutorial, we are going to look at how you can work with components
within your VueJS applications. We are going to start at looking at very simple
components and then move on to your standard &lt;code&gt;.vue&lt;/code&gt; file components.&lt;/p&gt;</description></item><item><title>Functions and Variables in Python</title><link>https://tutorialedge.net/python/python-functions-and-variables/</link><pubDate>Mon, 18 Sep 2017 19:19:39 +0100</pubDate><guid>https://tutorialedge.net/python/python-functions-and-variables/</guid><description>&lt;h2 id="variables-in-python"&gt;
 &lt;a href="#variables-in-python" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Variables in Python&lt;/h2&gt;
&lt;p&gt;Let’s first have a look at variables. A variable is essentially a place where we
can store the value of something for processing later on. Imagine you wanted to
write a program that doubled a number for us, not the most exciting of programs
I know but it is a good example.&lt;/p&gt;
&lt;p&gt;We would first want to define a variable to store our number, double it and then
print it out.&lt;/p&gt;</description></item><item><title>Part 3 - Drawing Your First Triangle</title><link>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-3-drawing-your-first-triangle/</link><pubDate>Fri, 29 May 2026 10:03:00 +0000</pubDate><guid>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-3-drawing-your-first-triangle/</guid><description>&lt;p&gt;The triangle is the &amp;ldquo;hello world&amp;rdquo; of graphics programming. In this part we define vertex data, upload it to the GPU, write our first shaders in WGSL, and draw a colourful triangle to the screen.&lt;/p&gt;
&lt;p&gt;Add &lt;code&gt;bytemuck&lt;/code&gt; to &lt;code&gt;Cargo.toml&lt;/code&gt; before you start:&lt;/p&gt;
&lt;div class="filename"&gt;Cargo.toml&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;dependencies&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wgpu &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;29.0.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winit &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.29.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pollster &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.4.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;env_logger &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.11&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;log &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bytemuck &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt; version &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;1.14&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; features &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;derive&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="what-is-a-vertex-buffer"&gt;
 &lt;a href="#what-is-a-vertex-buffer" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is a Vertex Buffer?&lt;/h2&gt;
&lt;p&gt;The GPU doesn&amp;rsquo;t know about Rust structs. To draw geometry, you copy raw bytes into a &lt;strong&gt;vertex buffer&lt;/strong&gt; — a block of GPU memory that the vertex shader reads one vertex at a time. We define a &lt;code&gt;Vertex&lt;/code&gt; struct, fill a slice of them, and upload it.&lt;/p&gt;</description></item><item><title>Part 3 - Middleware Pipeline</title><link>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-3-middleware-pipeline/</link><pubDate>Fri, 20 Mar 2026 10:03:00 +0000</pubDate><guid>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-3-middleware-pipeline/</guid><description>&lt;p&gt;In the &lt;a href="./projects/building-api-gateway-in-rust/part-2-routing-and-path-matching/"
 title="previous tutorial" 
 &gt;
 previous tutorial&lt;/a&gt;, we added routing to our gateway. Now it&amp;rsquo;s time to add &lt;strong&gt;middleware&lt;/strong&gt; — the mechanism that lets us process requests and responses as they flow through the gateway.&lt;/p&gt;
&lt;p&gt;Middleware is where the real power of an API gateway lives. Logging, authentication, rate limiting, header manipulation — these are all concerns that apply across services, and middleware lets us handle them in one place rather than duplicating logic in every backend service.&lt;/p&gt;</description></item><item><title>Part 3 - Adding The Vue Router to our Application</title><link>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-3-adding-vue-router/</link><pubDate>Thu, 02 Jan 2020 18:44:50 +0100</pubDate><guid>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-3-adding-vue-router/</guid><description>&lt;p&gt;In the last tutorial in this series, we looked at building a really simple component within our Imgur application. Now that we have some fo the basics under our belt when it comes to building components, it&amp;rsquo;s time to look at how we can start building a more complex application and introduce multiple components and a router that allows us to switch between rendering certain components.&lt;/p&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be looking primarily at how you can set up your Vue.JS application to use the incredibly popular &lt;code&gt;vue router&lt;/code&gt; package. We&amp;rsquo;ll be covering how routing works in terms of all Single Page Applications, and then how it specifically works within Vue.JS.&lt;/p&gt;</description></item><item><title>Challenge 03 - Sorting Flights by Price</title><link>https://tutorialedge.net/challenges/go/sort-by-price/</link><pubDate>Sun, 24 Nov 2019 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/challenges/go/sort-by-price/</guid><description>&lt;p&gt;In this challenge, you are going to be attempting to sort a list of &lt;code&gt;Flight&lt;/code&gt;s based on their price from highest to lowest.&lt;/p&gt;
&lt;p&gt;You will have to implement the &lt;code&gt;SortByPrice&lt;/code&gt; function that takes in a slice of type &lt;code&gt;Flight&lt;/code&gt; and returns the sorted list of Flights.&lt;/p&gt;
&lt;p&gt;In order to help you see what is going on, you have been provided a very quick printFlights function which you can use to print the flights out.&lt;/p&gt;</description></item><item><title>Part 3 - Setting Up our RDS Database</title><link>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-3-setting-up-rds-database/</link><pubDate>Tue, 24 Jul 2018 21:19:40 +0100</pubDate><guid>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-3-setting-up-rds-database/</guid><description>&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Welcome back to part 3 of my course on building a blog with Vue.JS on AWS. In
this part of the course, we are going to be setting up an RDS instance which
will store all of our blog&amp;rsquo;s articles and posts.&lt;/p&gt;
&lt;p&gt;Once we have our database instance set up and our schema defined, we can then
move on to building Lambda functions that will query this database and return
the results to our frontend.&lt;/p&gt;</description></item><item><title>Go Composite Types Tutorial</title><link>https://tutorialedge.net/golang/go-complex-types-tutorial/</link><pubDate>Sat, 14 Jul 2018 22:24:26 +0100</pubDate><guid>https://tutorialedge.net/golang/go-complex-types-tutorial/</guid><description>&lt;p&gt;Welcome All! In this tutorial, we are going to be looking at the various
different composite data types that are available in the Go programming
language.&lt;/p&gt;
&lt;p&gt;If you haven&amp;rsquo;t already, I&amp;rsquo;d suggest you check out my other tutorial in this
course on &lt;a href="./golang/go-basic-types-tutorial/"
 title="Basic Data Types" 
 &gt;
 Basic Data Types&lt;/a&gt;. You&amp;rsquo;ll need to
know about these basic data types in order to understand some of the composite
data types.&lt;/p&gt;
&lt;h2 id="arrays"&gt;
 &lt;a href="#arrays" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Arrays&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s dive into our first Composite data type, the &lt;code&gt;array&lt;/code&gt; and see how we can
declare arrays and work with them.&lt;/p&gt;</description></item><item><title>Part 4 - Setting Up Our Dynamodb Table</title><link>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-4-setting-up-our-dynamodb-table/</link><pubDate>Fri, 20 Apr 2018 12:31:40 +0100</pubDate><guid>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-4-setting-up-our-dynamodb-table/</guid><description>&lt;p&gt;In the previous tutorial, we managed to get our first Lambda tutorial up and
running, however, it doesn&amp;rsquo;t do anything too exciting as it stands. This is
where Dynamo comes in, we need to create a DynamoDB table where we can store
everything we need for our blog. This includes new blog posts, any comments,
ratings, and whatever else we can think of!&lt;/p&gt;
&lt;p&gt;Once we have this new table all defined, we can start to play about with
inserting things and then retrieving them using our existing Lambda function.
Let&amp;rsquo;s get started!&lt;/p&gt;</description></item><item><title>Part 3 - Designing our Frontend</title><link>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-3-designing-our-frontend/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-3-designing-our-frontend/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This post is part 3 of a series on building a chat application in
Go with ReactJS. You can find part 2 here -
&lt;a href="./projects/chat-system-in-go-and-react/part-2-simple-communication/"
 title="Part 2 - Simple Communication" 
 &gt;
 Part 2 - Simple Communication&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this part of the series, we&amp;rsquo;re going to be looking at improving our frontend
and fleshing out the application so that it looks and feels like a decent online
chat application.&lt;/p&gt;
&lt;p&gt;By the end of this part of the series, you should have a really solid looking
frontend which looks a little something like this:&lt;/p&gt;</description></item><item><title>Vue.js Event Handling Tutorial</title><link>https://tutorialedge.net/javascript/vuejs/vuejs-event-handling-tutorial/</link><pubDate>Sun, 04 Mar 2018 15:03:41 +0000</pubDate><guid>https://tutorialedge.net/javascript/vuejs/vuejs-event-handling-tutorial/</guid><description>&lt;!-- TODO: Need to validate this with interactive elements now removed --&gt;
&lt;blockquote&gt;
&lt;p&gt;The official documentation for VueJS event handling can be found here:
&lt;a href="https://vuejs.org/v2/guide/events.html"
 title="VueJS Event Handling" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 VueJS Event Handling&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, we are going to look at how you can successfully handle events
within your VueJS applications. This is by no means a replacement for the
official documentation, think of it more so as a suplementary guide filled with
live examples!&lt;/p&gt;</description></item><item><title>Working with Lists in Python - Tutorial</title><link>https://tutorialedge.net/python/python-lists-tutorial/</link><pubDate>Wed, 20 Dec 2017 19:22:48 +0000</pubDate><guid>https://tutorialedge.net/python/python-lists-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built in Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="a-simple-list"&gt;
 &lt;a href="#a-simple-list" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;A Simple List&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;my_list &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;my_list&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="reversing-a-list"&gt;
 &lt;a href="#reversing-a-list" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Reversing a List&lt;/h2&gt;
&lt;p&gt;This quick and easy technique shows how you can access all the elements of a
list in reverse order.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; my_list &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;&lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;&lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; my_list&lt;span style="color:#eceff4"&gt;[::&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="try-it-out"&gt;
 &lt;a href="#try-it-out" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Try it Out&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;my_list &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;my_list&lt;span style="color:#eceff4"&gt;[::&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can then treat our reversed list as an &lt;code&gt;iterator&lt;/code&gt; and iterate through every
element within this reversed list like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; el &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; my_list&lt;span style="color:#eceff4"&gt;[::&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;...&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;el&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="conclusion"&gt;
 &lt;a href="#conclusion" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you found this tutorial useful or require further assistance then please let
me know in the comments section below or by tweeting me:
&lt;a href="https://twitter.com/elliot_f"
 title="@Elliot_F" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 @Elliot_F&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Part 4 - Colors and Uniforms</title><link>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-4-colors-and-uniforms/</link><pubDate>Fri, 29 May 2026 10:04:00 +0000</pubDate><guid>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-4-colors-and-uniforms/</guid><description>&lt;p&gt;So far our triangle is static. In this part we add a CPU-to-GPU data channel called a &lt;strong&gt;uniform buffer&lt;/strong&gt;, and use it to animate the triangle&amp;rsquo;s colour tint every frame.&lt;/p&gt;
&lt;h2 id="what-is-a-uniform-buffer"&gt;
 &lt;a href="#what-is-a-uniform-buffer" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is a Uniform Buffer?&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;uniform&lt;/strong&gt; is a value that stays constant across all vertices and fragments in a single draw call, but can be updated between frames. It&amp;rsquo;s how you pass per-frame data — time, camera position, colour — from your Rust code into the shader.&lt;/p&gt;</description></item><item><title>Part 4 - Rate Limiting</title><link>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-4-rate-limiting/</link><pubDate>Fri, 20 Mar 2026 10:04:00 +0000</pubDate><guid>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-4-rate-limiting/</guid><description>&lt;p&gt;In the &lt;a href="./projects/building-api-gateway-in-rust/part-3-middleware-pipeline/"
 title="previous tutorial" 
 &gt;
 previous tutorial&lt;/a&gt;, we built a middleware pipeline with logging, CORS, and header injection. Now we&amp;rsquo;re going to add one of the most important features of any API gateway: &lt;strong&gt;rate limiting&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Without rate limiting, a single client can overwhelm your backend services — whether intentionally (a DDoS attack) or accidentally (a buggy client in a retry loop). Rate limiting puts a cap on how many requests a client can make in a given time window.&lt;/p&gt;</description></item><item><title>Challenge 04 - Checking for Duplicates</title><link>https://tutorialedge.net/challenges/go/checking-for-duplicates/</link><pubDate>Sun, 24 May 2020 21:23:23 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/checking-for-duplicates/</guid><description>&lt;p&gt;In this challenge, we are going to be looking at how you can effectively filter out the duplicate entries from a slice in Go.&lt;/p&gt;
&lt;p&gt;The task will be to implement the &lt;code&gt;FilterDuplicates&lt;/code&gt; function so that it returns a slice of type string which contains only the unique names of developers retrieved from the inputted list.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// input&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;Developers&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Developer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Elliot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Developer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Alan&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Developer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Jennifer&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Developer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Graham&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Developer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Paul&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Developer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Alan&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// output&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Elliot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Alan&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Jennifer&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Graham&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Paul&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details&gt;&lt;summary&gt;Hints&lt;/summary&gt;
&lt;p&gt;You may wish to use a &lt;code&gt;map&lt;/code&gt; in your function in order to check if elements have already been seen by our function.&lt;/p&gt;</description></item><item><title>Go Functions Tutorial</title><link>https://tutorialedge.net/golang/go-functions-tutorial/</link><pubDate>Sat, 14 Jul 2018 22:23:10 +0100</pubDate><guid>https://tutorialedge.net/golang/go-functions-tutorial/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, we are going to be looking at functions in Golang&lt;/strong&gt; and hopefully, by
the end of this tutorial, you will have a firm grasp as to what they are and how
you can use them in your own projects.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be covering the following topics within this tutorial:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The basics on Function Declaration&lt;/li&gt;
&lt;li&gt;Working with multiple return values&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At the end of this tutorial, there will be challenges that you can attempt to complete on
your own working machine that will help to validate what we have covered and give you
a taste of writing your own functions in Go.&lt;/p&gt;</description></item><item><title>Part 5 - Getting Started With AWS Cognito</title><link>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-5-getting-started-with-cognito/</link><pubDate>Fri, 20 Apr 2018 12:41:31 +0100</pubDate><guid>https://tutorialedge.net/projects/building-blog-with-vuejs-aws/part-5-getting-started-with-cognito/</guid><description>&lt;p&gt;In the previous tutorial, we managed to get our DynamoDB table set up and
populated with a couple of very simple posts. In this tutorial, we are going to
set up a Cognito pool that will store all of the users that register for our
Blog. We&amp;rsquo;ll also be able to improve our Lambda endpoints so that they aren&amp;rsquo;t
open to the world, they require authentication before they start updating our
database, this will stop unauthorized people potentially updating posts and
doing malicious things.&lt;/p&gt;</description></item><item><title>Part 4 - Handling Multiple Clients</title><link>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-4-handling-multiple-clients/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-4-handling-multiple-clients/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This post is part 4 of a series on building a chat application in
Go with ReactJS. You can find part 3 here -
&lt;a href="./projects/chat-system-in-go-and-react/part-3-designing-our-frontend/"
 title="Part 3 - Designing Our Frontend" 
 &gt;
 Part 3 - Designing Our Frontend&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;It&amp;rsquo;s time to implement the ability to handle multiple clients and broadcast any
received messages to every connected client. By the end of this part of the
series we&amp;rsquo;ll have:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;implemented a Pool mechanism that will effectively allow us to track how many
connections we have into our WebSocket server.&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ll also be able to broadcast any received messages to all connections
within our connection pool.&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ll also be able to inform any existing clients when another client connects
or disconnects.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Our application will look a little like this by the end of this part of the
course:&lt;/p&gt;</description></item><item><title>Vue.js HTTP Requests with Axios Tutorial</title><link>https://tutorialedge.net/javascript/vuejs/vuejs-http-requests-axios-tutorial/</link><pubDate>Thu, 01 Mar 2018 12:36:54 +0000</pubDate><guid>https://tutorialedge.net/javascript/vuejs/vuejs-http-requests-axios-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This Tutorial builds off the starter application that we generated in the
&lt;a href="./javascript/vuejs/getting-started-with-vuejs/"
 title="Getting Started with VueJS" 
 &gt;
 Getting Started with VueJS&lt;/a&gt;
article.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this article, we are going to look at how you can use the &lt;code&gt;axios&lt;/code&gt; library to
make &lt;code&gt;HTTP&lt;/code&gt; requests within your VueJS 2 applications. The &lt;code&gt;axios&lt;/code&gt; framework is
without a doubt the most popular &lt;code&gt;HTTP&lt;/code&gt; frameworks to use within the framework
and makes the job of sending requests simple.&lt;/p&gt;</description></item><item><title>Working With The File System in Python</title><link>https://tutorialedge.net/python/python-working-with-file-system/</link><pubDate>Wed, 20 Dec 2017 18:41:30 +0000</pubDate><guid>https://tutorialedge.net/python/python-working-with-file-system/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was written using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Being able to work with the file system and do things like traverse directories
or retrieve every file can be very handy in a number of different situations.&lt;/p&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be taking a look at the various ways you can work with
the file system in Python. Hopefully this will give you a decent grasp of some
of the cool things you can do very quickly and succinctly using the Python
programming language.&lt;/p&gt;</description></item><item><title>Part 5 - Textures and Image Loading</title><link>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-5-textures-and-image-loading/</link><pubDate>Fri, 29 May 2026 10:05:00 +0000</pubDate><guid>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-5-textures-and-image-loading/</guid><description>&lt;p&gt;A triangle is a great proof-of-concept, but most real graphics involve images. In this part we load a PNG, upload it to the GPU as a texture, and sample it onto a textured quad.&lt;/p&gt;
&lt;p&gt;Add the &lt;code&gt;image&lt;/code&gt; crate to &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="filename"&gt;Cargo.toml&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;dependencies&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wgpu &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;29.0.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winit &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.29.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pollster &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.4.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;env_logger &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.11&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;log &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bytemuck &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt; version &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;1.14&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; features &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;derive&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;image &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.25&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Place any PNG image at &lt;code&gt;assets/happy-tree.png&lt;/code&gt; in your project root. Any image will work — we&amp;rsquo;ll use it as the texture.&lt;/p&gt;</description></item><item><title>Part 5 - Load Balancing &amp; Health Checks</title><link>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-5-load-balancing-and-health-checks/</link><pubDate>Fri, 20 Mar 2026 10:05:00 +0000</pubDate><guid>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-5-load-balancing-and-health-checks/</guid><description>&lt;p&gt;In the &lt;a href="./projects/building-api-gateway-in-rust/part-4-rate-limiting/"
 title="previous tutorial" 
 &gt;
 previous tutorial&lt;/a&gt;, we added rate limiting to protect our backends from abuse. Now we&amp;rsquo;re going to tackle another critical piece of infrastructure: &lt;strong&gt;load balancing&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Up to this point, each route in our gateway maps to a single backend server. But in production, you typically run multiple instances of each service for reliability and throughput. If one instance crashes, the others keep serving traffic. Load balancing distributes requests across these instances.&lt;/p&gt;</description></item><item><title>Challenge 05 - Implementing a Stack in Go</title><link>https://tutorialedge.net/challenges/go/implementing-a-stack/</link><pubDate>Mon, 25 May 2020 19:47:24 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/implementing-a-stack/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, we are going to be implementing some of the basic functionality of the &lt;code&gt;Stack&lt;/code&gt; data structure in Go.&lt;/p&gt;
&lt;p&gt;This is going to be the first of a number of data-structure questions which may come in handy if you are about to go in for an interview!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be carrying on the theme of flying from the previous challenge here and implementing 3 crucial methods needed to support a basic implementation of a stack.&lt;/p&gt;</description></item><item><title>Part 4 - Uploading and Storing Images</title><link>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-4-storing-our-images/</link><pubDate>Sat, 04 Jan 2020 00:44:50 +0100</pubDate><guid>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-4-storing-our-images/</guid><description>&lt;p&gt;In this tutorial, we are going to look at building out the backend of our imgur clone and start creating a few simple AWS Lambda functions that will handle actions such as uploading and retrieving images.&lt;/p&gt;
&lt;p&gt;This is where our application really starts to take shape and provide real value to our users, just without some critical functions like authentication and registration, which we will be covering in the next tutorial in this series.&lt;/p&gt;</description></item><item><title>Go Methods Tutorial</title><link>https://tutorialedge.net/golang/go-methods-tutorial/</link><pubDate>Sat, 14 Jul 2018 22:23:10 +0100</pubDate><guid>https://tutorialedge.net/golang/go-methods-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to first of all look at what methods are and how
they work within the confines of the Go programming language. We&amp;rsquo;ll then take a
look at demystifying the differences between both methods and functions and when
you should ideally use them within your Go programs.&lt;/p&gt;
&lt;h2 id="a-simple-example"&gt;
 &lt;a href="#a-simple-example" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;A Simple Example&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by covering what methods and how we can implement our own in our
Go systems. We&amp;rsquo;ll be creating an incredibly simple employee management system
that allows you to Update an employees name and print that name out. Not the
most exciting of example projects, but it&amp;rsquo;ll serve its purpose as a means of
demonstration.&lt;/p&gt;</description></item><item><title>Part 5 - Improving the Frontend</title><link>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-5-improved-frontend/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-5-improved-frontend/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This post is part 5 of a series on building a chat application in
Go with ReactJS. You can find part 4 here -
&lt;a href="./projects/chat-system-in-go-and-react/part-4-handling-multiple-clients/"
 title="Part 4 - Handling Multiple Clients" 
 &gt;
 Part 4 - Handling Multiple Clients&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome to the 5th part of this series! If you&amp;rsquo;ve made it this far then I
sincerely hope you are enjoying learning new Go concepts and building up your
own chat system in Go and React!&lt;/p&gt;</description></item><item><title>Vue.js Vue-Router Beginners Tutorial</title><link>https://tutorialedge.net/javascript/vuejs/vue-router-beginners-tutorial/</link><pubDate>Wed, 14 Mar 2018 19:12:49 +0000</pubDate><guid>https://tutorialedge.net/javascript/vuejs/vue-router-beginners-tutorial/</guid><description>&lt;p&gt;The vue-router within VueJS allows you to create powerful Single Page
Applications with minimal fuss. On a traditional website, each distinct page
would constitute a request to the server to load the relevant file. So when
someone navigated to &lt;code&gt;http://myapp.com/page-1.html&lt;/code&gt;, the &lt;code&gt;page-1.html&lt;/code&gt; file would
be served up.&lt;/p&gt;
&lt;p&gt;However, when navigating through a single page application, you only have see
one request made to the server which returns your entire JavaScript application.
This means you have full control over the experience your users have when
navigating through your application, you can fully control any behaviours you
wish in terms of transitions and this tends to give your site a far more dynamic
look and feel.&lt;/p&gt;</description></item><item><title>Reading and Writing Files In Python</title><link>https://tutorialedge.net/python/python-reading-writing-files/</link><pubDate>Sun, 10 Sep 2017 08:59:29 +0100</pubDate><guid>https://tutorialedge.net/python/python-reading-writing-files/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was written using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Being able to effectively work with the filesystem in any programming language
is important as there will always be a need to do things such as import data
from files or store data in local files. In this tutorial we&amp;rsquo;ll be looking at
how you can create files, write to these newly created and then subsequently
delete these files once we are done.&lt;/p&gt;</description></item><item><title>Part 6 - 2D Transformations</title><link>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-6-2d-transformations/</link><pubDate>Fri, 29 May 2026 10:06:00 +0000</pubDate><guid>https://tutorialedge.net/projects/graphics-with-wgpu-in-rust/part-6-2d-transformations/</guid><description>&lt;p&gt;Static images are a start, but real graphics need to move. In this part we apply a &lt;strong&gt;transformation matrix&lt;/strong&gt; to the vertex shader so we can rotate and scale the textured quad every frame.&lt;/p&gt;
&lt;p&gt;Add &lt;code&gt;glam&lt;/code&gt; to &lt;code&gt;Cargo.toml&lt;/code&gt;:&lt;/p&gt;
&lt;div class="filename"&gt;Cargo.toml&lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-toml" data-lang="toml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;dependencies&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;wgpu &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;29.0.3&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;winit &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.29.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pollster &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.4.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;env_logger &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.11&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;log &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.4&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;bytemuck &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt; version &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;1.14&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; features &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;derive&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;image &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.25&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;glam &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt; version &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;0.27&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; features &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;bytemuck&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="what-is-a-transformation-matrix"&gt;
 &lt;a href="#what-is-a-transformation-matrix" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is a Transformation Matrix?&lt;/h2&gt;
&lt;p&gt;A &lt;strong&gt;4×4 transformation matrix&lt;/strong&gt; encodes translation (position), rotation, and scale in a single structure. Multiplying a vertex position by the matrix produces the transformed position — all three operations in one GPU instruction.&lt;/p&gt;</description></item><item><title>Go Interfaces Tutorial</title><link>https://tutorialedge.net/golang/go-interfaces-tutorial/</link><pubDate>Thu, 28 May 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/go-interfaces-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Source Code:&lt;/strong&gt; The full source code for this tutorial is on GitHub: &lt;a href="https://github.com/TutorialEdge/go-interfaces-tutorial"
 title="TutorialEdge/Go-Interfaces-Tutorial" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 TutorialEdge/Go-Interfaces-Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;By the end of this tutorial, you&amp;rsquo;ll understand:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What interfaces are and why Go uses them&lt;/li&gt;
&lt;li&gt;How to define your own interfaces&lt;/li&gt;
&lt;li&gt;How Go satisfies interfaces implicitly — no &lt;code&gt;implements&lt;/code&gt; keyword needed&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="basic-example"&gt;
 &lt;a href="#basic-example" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Basic Example&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re new to Go, you&amp;rsquo;ll see &lt;code&gt;interface{}&lt;/code&gt; (or its modern alias &lt;code&gt;any&lt;/code&gt;) frequently in code. A function that accepts &lt;code&gt;interface{}&lt;/code&gt; will accept a value of any type.&lt;/p&gt;</description></item><item><title>Part 6 - Configuration &amp; Authentication</title><link>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-6-configuration-and-authentication/</link><pubDate>Fri, 20 Mar 2026 10:06:00 +0000</pubDate><guid>https://tutorialedge.net/projects/building-api-gateway-in-rust/part-6-configuration-and-authentication/</guid><description>&lt;p&gt;Welcome to the final part of the series! In the &lt;a href="./projects/building-api-gateway-in-rust/part-5-load-balancing-and-health-checks/"
 title="previous tutorial" 
 &gt;
 previous tutorial&lt;/a&gt;, we added load balancing and health checks. Our gateway is fully functional, but everything is hardcoded in &lt;code&gt;main.rs&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll make two final improvements: moving all configuration into a YAML file so you can change the gateway&amp;rsquo;s behavior without recompiling, and adding JWT authentication middleware so the gateway can protect backend services from unauthorized access.&lt;/p&gt;</description></item><item><title>Test Paid Video</title><link>https://tutorialedge.net/courses/test/</link><pubDate>Wed, 01 Jul 2020 21:12:04 +0100</pubDate><guid>https://tutorialedge.net/courses/test/</guid><description>&lt;p&gt;In this tutorial, we are going to be implementing Auth0 into our React.js application. This will allow users to sign up and create a profile within our app.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧙 Note -&lt;/strong&gt; you can find the official documentation for setting up an Auth0 account here - &lt;a href="https://auth0.com/docs/quickstart/spa/react/01-login"
 title="Auth0 React Quickstart" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Auth0 React Quickstart&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Challenge 06 - Implementing a Queue in Go</title><link>https://tutorialedge.net/challenges/go/implementing-a-queue/</link><pubDate>Mon, 25 May 2020 19:47:24 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/implementing-a-queue/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, we are going to be implementing some of the basic functionality of the &lt;code&gt;Queue&lt;/code&gt; data structure in Go.&lt;/p&gt;
&lt;p&gt;This is going to be the first of a number of data-structure questions which may come in handy if you are about to go in for an interview!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be carrying on the theme of flying from the previous challenge here and implementing 3 crucial methods needed to support a basic implementation of a Queue.&lt;/p&gt;</description></item><item><title>Part 5 - Authentication With Cognito and Route Guards</title><link>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-5-authentication/</link><pubDate>Sat, 11 Jan 2020 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-5-authentication/</guid><description>&lt;p&gt;In this tutorial, we are going to be taking a first look at how we will be adding authentication/authorization to our Vue.JS Imgur application. This is a fairly large and complex topic, but we&amp;rsquo;ll be breaking it down into 2 parts.&lt;/p&gt;
&lt;p&gt;In this part, we&amp;rsquo;ll be creating a helper class that will feature everything we need in order to talk to a &lt;code&gt;cognito&lt;/code&gt; user pool that we&amp;rsquo;ll be creating again with terraform, and we&amp;rsquo;ll also be adding a few route guards to our application to see how these will protect certain sections of our app from unauthorized users!&lt;/p&gt;</description></item><item><title>Part 6 - Dockerizing your Backend</title><link>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-6-dockerizing-your-backend/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/projects/chat-system-in-go-and-react/part-6-dockerizing-your-backend/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This post is part 6 of a series on building a chat application in
Go with ReactJS. You can find part 5 here -
&lt;a href="./projects/chat-system-in-go-and-react/part-5-improved-frontend/"
 title="Part 5 - Improving the Frontend" 
 &gt;
 Part 5 - Improving the Frontend&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this part of the series, we are going to be focusing on adding Docker to our
backend application.&lt;/p&gt;
&lt;p&gt;Why are we doing this now you might ask? Well, before we look into things like
authentication, load balancing and deployment, it&amp;rsquo;ll be good to have a standard
way of deploying our application using containerization technology.&lt;/p&gt;</description></item><item><title>Vue.js Animations and Transitions Tutorial</title><link>https://tutorialedge.net/javascript/vuejs/vuejs-transitions-animations-tutorial/</link><pubDate>Thu, 01 Mar 2018 12:26:40 +0000</pubDate><guid>https://tutorialedge.net/javascript/vuejs/vuejs-transitions-animations-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to explore how we can use animations and
transitions to make our VueJS web application really stand out from the crowd.&lt;/p&gt;
&lt;h2 id="a-simple-transition"&gt;
 &lt;a href="#a-simple-transition" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;A Simple Transition&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start of by creating a few very simple transitions, these will simply fade
in when a certain condition is met. I was watching Mission Impossible whilst
writing this so the theme for this is a top secret mission. The finished product
for this section is going to look something like this:&lt;/p&gt;</description></item><item><title>Python Maps Tutorial</title><link>https://tutorialedge.net/python/python-maps-tutorial/</link><pubDate>Wed, 24 May 2017 07:57:51 +0100</pubDate><guid>https://tutorialedge.net/python/python-maps-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Maps in Python are syntactic sugar that allow you to very succinctly iterate
through every element of an array and perform a function on it.&lt;/p&gt;
&lt;p&gt;Imagine we started off with a list of values numbering from 2-6 like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;values &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;&lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;&lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;&lt;span style="color:#b48ead"&gt;6&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And we had a function which doubled said values:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;double&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;x&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; x &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Without the use of maps we would have to do something like so in order to
multiply every element:&lt;/p&gt;</description></item><item><title>Part 6 - Our Login/Registration Flow</title><link>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-6-login-register-flow/</link><pubDate>Tue, 14 Jan 2020 12:00:50 +0100</pubDate><guid>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-6-login-register-flow/</guid><description>&lt;p&gt;In the previous tutorial in this series, we looked at creating a Cognito User Pool using Terraform and creating the &lt;code&gt;cognitoAuth&lt;/code&gt; class which we then hooked up to some route guards in order to protect some special areas of our application.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be extending this and building out our register/login flow so that new people coming into the application can register a new account and login/logout as and when they wish.&lt;/p&gt;</description></item><item><title>Challenge 07 - Minimums, Maximums and Errors</title><link>https://tutorialedge.net/challenges/go/min-max-errors/</link><pubDate>Sun, 24 Nov 2019 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/challenges/go/min-max-errors/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, we&amp;rsquo;ll be testing your ability to handle edge cases and work with the &lt;code&gt;errors&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;In this challenge, you have the task of implementing the &lt;code&gt;GetMinMax&lt;/code&gt; function which will take in a &lt;code&gt;slice&lt;/code&gt; of type Flight.&lt;/p&gt;
&lt;p&gt;The function will return 3 values:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;min&lt;/code&gt; - The cheapest price from the list passed in.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max&lt;/code&gt; - The most expensive price from the list passed in.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;error&lt;/code&gt; - Any error values should there be issues with the list passed in.&lt;/li&gt;
&lt;/ul&gt;
&lt;details&gt;&lt;summary&gt;Hint&lt;/summary&gt;
&lt;p&gt;You can create new errors using the &lt;code&gt;error&lt;/code&gt; package and calling &lt;code&gt;errors.New()&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Debugging with the Python Debugger - PDB</title><link>https://tutorialedge.net/python/debugging-with-pdb-python/</link><pubDate>Sat, 02 Sep 2017 13:35:28 +0100</pubDate><guid>https://tutorialedge.net/python/debugging-with-pdb-python/</guid><description>&lt;p&gt;In this tutorial we&amp;rsquo;ll be having a look at the Python Debugger, what it is and
how you can use it to effectively debug your Python applications.&lt;/p&gt;
&lt;p&gt;Knowing how to debug your code is an incredibly important tool in any
programmers arsenal. Thankfully Python comes with the excellent PDB or Python
DeBugger which allows us to step through our code and effectively work out what
has gone wrong.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The official documentation for the Python Debugger can be found here:
&lt;a href="https://docs.python.org/3.6/library/pdb.html"
 title="Python Debugger" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Python Debugger&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Reading And Writing To Files in Go</title><link>https://tutorialedge.net/golang/reading-writing-files-in-go/</link><pubDate>Thu, 28 May 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/reading-writing-files-in-go/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; If you are working with structured data, you may also like &lt;a href="./golang/go-json-tutorial/"
 title="Go JSON Tutorial" 
 &gt;
 Go JSON Tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The techniques we&amp;rsquo;ll cover here are file format-agnostic — you can use them to read and write &lt;code&gt;.txt&lt;/code&gt;, &lt;code&gt;.csv&lt;/code&gt;, &lt;code&gt;.json&lt;/code&gt;, or any other file type. The only thing that differs between formats is how you parse or structure the data inside.&lt;/p&gt;
&lt;h2 id="reading-files"&gt;
 &lt;a href="#reading-files" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Reading Files&lt;/h2&gt;
&lt;p&gt;Use &lt;code&gt;os.ReadFile&lt;/code&gt; to read the entire contents of a file into memory in one call.&lt;/p&gt;</description></item><item><title>Executing System Commands With Go</title><link>https://tutorialedge.net/golang/executing-system-commands-with-golang/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/executing-system-commands-with-golang/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Last Updated -&lt;/strong&gt; 7th March, 2026&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, we are going to be taking a look at the &lt;code&gt;os/exec&lt;/code&gt; package in
the standard library and how we can use this to successfully execute system
commands within our Go applications. We&amp;rsquo;ll cover modern Go 1.26 patterns and best practices for command execution, including timeout handling and security considerations.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; The official documentation for executing system commands can be
found under the exec package:
&lt;a href="https://golang.org/pkg/os/exec/"
 title="os/exec package" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 os/exec package&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Reading in Console Input in Go</title><link>https://tutorialedge.net/golang/reading-console-input-golang/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/reading-console-input-golang/</guid><description>&lt;p&gt;This is a quick and simple tutorial on how to read in console text input into
your Go (GoLang) program. This tutorial has been updated for Go 1.26 and covers
modern approaches for console input. We&amp;rsquo;ll be creating the basis for a very simple
shell that will take in all user input and simply echo it back to the user. We&amp;rsquo;ll
focus on modern approaches using &lt;code&gt;bufio.Scanner&lt;/code&gt; and &lt;code&gt;fmt&lt;/code&gt; functions.&lt;/p&gt;</description></item><item><title>Challenge 08 - Check Permutations</title><link>https://tutorialedge.net/challenges/go/check-permutations/</link><pubDate>Thu, 28 May 2020 21:08:18 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/check-permutations/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this Go challenge, you are going to be implementing a function that takes in two &lt;code&gt;string&lt;/code&gt; values and checks to see if they are permutations of one another.&lt;/p&gt;
&lt;h2 id="example"&gt;
 &lt;a href="#example" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Example&lt;/h2&gt;
&lt;p&gt;If I have 2 strings, &amp;ldquo;abc&amp;rdquo; and &amp;ldquo;cba&amp;rdquo;, when I pass these strings into the function, it should return &lt;code&gt;true&lt;/code&gt; as these two strings are permutations of each other.&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Hints&lt;/summary&gt;
&lt;blockquote&gt;
&lt;p&gt;You can iterate through all the characters in a string using the &lt;code&gt;range&lt;/code&gt; keyword in a for loop&lt;/p&gt;</description></item><item><title>Part 7 - Uploading Images To Our App</title><link>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-7-uploading-images/</link><pubDate>Sun, 26 Jan 2020 18:44:50 +0100</pubDate><guid>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-7-uploading-images/</guid><description>&lt;p&gt;In the last tutorial in this series, we successfully implemented a complete login/registration flow for our application that interfaces directly with an AWS Cognito UserPool.&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll finally start implementing some of the basic functionality that our app will need to survive in the wild and become self-driven by our newly registered users. More specifically, we will be adding the frontend &lt;strong&gt;Upload&lt;/strong&gt; component component that will do the job of talking to the upload API endpoint that we built and deployed in part 4 of this series.&lt;/p&gt;</description></item><item><title>Python Modules Tutorial</title><link>https://tutorialedge.net/python/python-modules-tutorial/</link><pubDate>Mon, 28 Aug 2017 18:42:27 +0100</pubDate><guid>https://tutorialedge.net/python/python-modules-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was developed using Python version 3.6.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Larger Python projects require larger degrees of order and sub-dividing your
project up into logical blocks can greatly improve the readability of your
codebase. In Python we can do this sub-division using a concept using modules.&lt;/p&gt;
&lt;p&gt;Say for instance you have a program that bought and sold widgets on the stock
market. This project does a number of things:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It performs analysis of the widgets and returns recommendations as to whether
to buy or sell these widgets&lt;/li&gt;
&lt;li&gt;It performs the buying and selling of said widgets&lt;/li&gt;
&lt;li&gt;It produces reports of the widgets it has bought and sold&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;In this scenario the code would be far too much for one file and as such
breaking it up into multiple modules would make sense in this instance. We could
have an &lt;code&gt;analysis&lt;/code&gt; module, a &lt;code&gt;trader&lt;/code&gt; module and a &lt;code&gt;reports&lt;/code&gt; module.&lt;/p&gt;</description></item><item><title>Parsing JSON files With Go</title><link>https://tutorialedge.net/golang/parsing-json-with-golang/</link><pubDate>Sat, 07 Mar 2026 21:07:11 +0100</pubDate><guid>https://tutorialedge.net/golang/parsing-json-with-golang/</guid><description>&lt;p&gt;Welcome all, in this tutorial, we are going to be taking a look at how you can
read in JSON files, or JSON HTTP responses and parse them to your hearts desire.&lt;/p&gt;
&lt;p&gt;JSON or Javascript Object Notation as it is short for, is a standard format for
sending and receiving information. We could represent the same information with
either XML or JSON, but JSON provides one advantage in the fact it is far more
compact and in my personal experience, more readable.&lt;/p&gt;</description></item><item><title>Challenge 09 - 🔗 Singly Linked Lists</title><link>https://tutorialedge.net/challenges/go/linked-list/</link><pubDate>Sat, 30 May 2020 08:41:49 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/linked-list/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you will be implementing some of the basic functionality of a singly linked-list in Go! 💪&lt;/p&gt;
&lt;p&gt;In this challenge, we will be attempted to implement the &lt;code&gt;Add&lt;/code&gt; function of a &lt;em&gt;singly linked list&lt;/em&gt;.&lt;/p&gt;
&lt;h2 id="linked-lists"&gt;
 &lt;a href="#linked-lists" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Linked Lists&lt;/h2&gt;
&lt;p&gt;Linked lists are a data structure we can utilize in order to represent a sequence of elements or &lt;code&gt;nodes&lt;/code&gt; as they are called. Singly linked lists are a one way sequence where each &lt;code&gt;node&lt;/code&gt; contains a pointer to the next &lt;code&gt;node&lt;/code&gt; in the list.&lt;/p&gt;</description></item><item><title>Part 8 - Deploying our Imgur Clone</title><link>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-8-deploying-our-app/</link><pubDate>Sat, 08 Feb 2020 18:44:50 +0100</pubDate><guid>https://tutorialedge.net/projects/building-imgur-clone-vuejs-nodejs/part-8-deploying-our-app/</guid><description>&lt;p&gt;In this tutorial in the series, we are going to look at an incredibly important, but often overlooked aspect of project development and that is deploying our app in an automated fashion. The main goal for this tutorial is to show you &lt;strong&gt;how you can fully automate both your Vue.js and your Serverless deploys using Travis-CI&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="the-importance-of-automated-deployment"&gt;
 &lt;a href="#the-importance-of-automated-deployment" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Importance of Automated Deployment&lt;/h2&gt;
&lt;p&gt;Being able to automatically and reliably deploy updates to your applications is hugely important regardless of what you are developing.&lt;/p&gt;</description></item><item><title>Python Project Layout Best Practices</title><link>https://tutorialedge.net/python/python-project-layout/</link><pubDate>Mon, 28 Aug 2017 18:47:50 +0100</pubDate><guid>https://tutorialedge.net/python/python-project-layout/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6. It should also be noted that these
are opinions and to be taken with a grain of salt.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Structure is an incredibly important aspect of all projects and following a
standard structure when it comes to designing your systems plays a huge part in
making it more maintainable. By following standards you are essentially easing
the job of new programmers coming on to a project as they&amp;rsquo;ll find it easier to
navigate around and become comfortable with your systems.&lt;/p&gt;</description></item><item><title>Profile Guided Optimizations for Go Applications</title><link>https://tutorialedge.net/golang/1.21/profile-guided-optimizations-for-go-applications/</link><pubDate>Tue, 01 Aug 2023 20:52:32 +0100</pubDate><guid>https://tutorialedge.net/golang/1.21/profile-guided-optimizations-for-go-applications/</guid><description>&lt;p&gt;The latest Go releases are absolutely stuffed with a number of fantastic new features, one of which, is the ability to significantly improve the performance of the hot paths within your applications using something called &lt;code&gt;Profile Guided Optimizations&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Go isn&amp;rsquo;t generally considered a slouch when it comes to performance, however, this technique, also known as feedback-directed optimizations (FDO) - can help you to squeeze out every last ounce of performance out of your app which can be vital if you&amp;rsquo;re working in a high-performance domain.&lt;/p&gt;</description></item><item><title>Challenge 10 - Word Frequencies</title><link>https://tutorialedge.net/challenges/go/word-frequencies/</link><pubDate>Sun, 31 May 2020 18:22:08 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/word-frequencies/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you will be tasked with efficiently counting the word frequencies of a large body of text in Go!&lt;/p&gt;
&lt;p&gt;You will have to implement a function which keeps track of the number of times a word appears in a body of text and then you will have to implement a further function which returns the top 5 most frequent words from highest to lowest.&lt;/p&gt;
&lt;Quiz question="We can rely on the ordering of maps to store a list of the top 5 words, true or false?" answer="False, you will have to rely on another data structure in order to return a list of the top 5 sorted words" correct="A" A="True" B="False" /&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;sort&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;strings&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Word &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Word &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Frequency &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; ByFrequency &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;Word
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;p ByFrequency&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;p&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;p ByFrequency&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Swap&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; j &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	p&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;],&lt;/span&gt; p&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;j&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; p&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;j&lt;span style="color:#eceff4"&gt;],&lt;/span&gt; p&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;p ByFrequency&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Less&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; j &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;bool&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; p&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;].&lt;/span&gt;Frequency &lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; p&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;j&lt;span style="color:#eceff4"&gt;].&lt;/span&gt;Frequency
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;SortByFrequency&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;words &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;Word&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;Word &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	sort&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Sort&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;ByFrequency&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;words&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; words
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CountWords&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;text &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	frequency &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; word &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; strings&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Split&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;text&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34; &amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; ok &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; frequency&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;word&lt;span style="color:#eceff4"&gt;];&lt;/span&gt; ok &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			frequency&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;word&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			frequency&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;word&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; frequency
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Top5Words&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;wordmap &lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;Word &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; words &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;Word
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; word&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; freq &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; wordmap &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		words &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;words&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; Word&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Word&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; word&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; Frequency&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; freq&lt;span style="color:#eceff4"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	sort&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Sort&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;ByFrequency&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;words&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; words&lt;span style="color:#eceff4"&gt;[:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;6&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Word Frequency Test&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	text &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;`Lorem Ipsum is simply dummy text of the printing and typesetting industry. Lorem Ipsum has been the industry&amp;#39;s standard dummy text ever since the 1500s, when an unknown printer took a galley of type and scrambled it to make a type specimen book. It has survived not only five centuries, but also the leap into electronic typesetting, remaining essentially unchanged. It was popularised in the 1960s with the release of Letraset sheets containing Lorem Ipsum passages, and more recently with desktop publishing software like Aldus PageMaker including versions of Lorem Ipsum.`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	results &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CountWords&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;text&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	MostCommon &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Top5Words&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;results&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;MostCommon&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this challenge, you may also enjoy some of the other challenges on this site:&lt;/p&gt;</description></item><item><title>Python Logging Best Practices</title><link>https://tutorialedge.net/python/python-logging-best-practices/</link><pubDate>Sun, 13 Aug 2017 17:06:57 +0100</pubDate><guid>https://tutorialedge.net/python/python-logging-best-practices/</guid><description>&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at some of the best practices that you should
be following when it comes to implementing logging in your Python programs.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This article was written against Python version 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="why-do-we-need-logging"&gt;
 &lt;a href="#why-do-we-need-logging" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Do We Need Logging?&lt;/h2&gt;
&lt;p&gt;Logging is an incredibly important feature of any application as it gives both
programmers and people supporting the application key insight into what their
systems are doing. Without proper logging we have no real idea as to why our
applications fail and no real recourse for fixing these applications.&lt;/p&gt;</description></item><item><title>Parsing XML Files With Go</title><link>https://tutorialedge.net/golang/parsing-xml-with-golang/</link><pubDate>Sun, 09 Apr 2017 21:07:45 +0100</pubDate><guid>https://tutorialedge.net/golang/parsing-xml-with-golang/</guid><description>&lt;p&gt;In this tutorial we look at how you can effectively read in an XML file from the
file system and then parse this file using Go’s
&lt;a href="https://golang.org/pkg/encoding/xml/"
 title="“encoding/xml” Package" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 “encoding/xml” Package&lt;/a&gt;. We’ll look at
how you can traverse multiple nested xml elements and then we’ll simply print
this out to our terminal window.&lt;/p&gt;
&lt;h2 id="our-example-xml-file"&gt;
 &lt;a href="#our-example-xml-file" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our Example XML File&lt;/h2&gt;
&lt;p&gt;So to begin with, we’ll need an xml file that we can traverse.&lt;/p&gt;</description></item><item><title>An Introduction to Testing in Go</title><link>https://tutorialedge.net/golang/intro-testing-in-go/</link><pubDate>Sat, 07 Mar 2026 17:27:18 +0000</pubDate><guid>https://tutorialedge.net/golang/intro-testing-in-go/</guid><description>&lt;blockquote&gt;
&lt;p&gt;🚀 My new course - &lt;a href="./courses/go-testing-bible/"
 title="The Golang Testing Bible" 
 &gt;
 The Golang Testing Bible&lt;/a&gt; is out now and covers everything you need to get up and running creating tests for your Go applications!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Testing is hugely important in all software.&lt;/strong&gt; Being able to ensure the
correctness of your code and ensure that any changes you make don&amp;rsquo;t end up
breaking anything else in different parts of your codebase is hugely important.&lt;/p&gt;
&lt;p&gt;By taking the time to adequately test your go programs you allow yourself to
develop faster with a greater sense of confidence that what you are developing
will continue to work when you release it to production.&lt;/p&gt;</description></item><item><title>Making HTTP requests in Go</title><link>https://tutorialedge.net/golang/making-http-requests-in-go-tutorial/</link><pubDate>Fri, 16 Dec 2022 17:27:18 +0000</pubDate><guid>https://tutorialedge.net/golang/making-http-requests-in-go-tutorial/</guid><description>&lt;p&gt;Welcome Gophers! In this tutorial, we are going to be taking a quick look at how we can make HTTP requests in Go!&lt;/p&gt;
&lt;p&gt;In Go, we can use the &lt;code&gt;net/http&lt;/code&gt; package in order to help us make our own HTTP requests.&lt;/p&gt;
&lt;h2 id="importing-the-package"&gt;
 &lt;a href="#importing-the-package" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Importing the Package&lt;/h2&gt;
&lt;p&gt;To use the net/http package in your Go program, you will need to import it first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="making-a-get-request"&gt;
 &lt;a href="#making-a-get-request" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Making a GET Request&lt;/h2&gt;
&lt;p&gt;The most basic type of HTTP request is a &lt;code&gt;GET&lt;/code&gt; request. To make a &lt;code&gt;GET&lt;/code&gt; request, you can use the &lt;code&gt;http.Get&lt;/code&gt; function like so:&lt;/p&gt;</description></item><item><title>Retrying HTTP Requests in Go with retry-go</title><link>https://tutorialedge.net/golang/retrying-http-requests-with-retry-go/</link><pubDate>Fri, 16 Dec 2022 17:27:18 +0000</pubDate><guid>https://tutorialedge.net/golang/retrying-http-requests-with-retry-go/</guid><description>&lt;p&gt;Welcome Gophers! In this quick tutorial, we are going to be looking at how we can easily retry HTTP requests in Go using the &lt;code&gt;retry-go&lt;/code&gt; library.&lt;/p&gt;
&lt;h2 id="retrying-requests"&gt;
 &lt;a href="#retrying-requests" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Retrying Requests&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;retry-go&lt;/code&gt; library is a convenient way to retry HTTP requests in Go with configurable options and callbacks.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/avast/retry-go&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;sendRequest&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; resp &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Response
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; retry&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Do&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; resp&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Get&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;http://www.example.com/&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; retry&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Attempts&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; retry&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;OnRetry&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n &lt;span style="color:#81a1c1"&gt;uint&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Retrying request after error: %v&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;defer&lt;/span&gt; resp&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Body&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Close&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// do something with the response&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In this example, the retry.Do function retries the HTTP GET request up to three times. If the request fails, the OnRetry hook is called, which logs the error.
If the request still fails after three attempts, the sendRequest function returns the error.&lt;/p&gt;</description></item><item><title>Challenge 11 - Sets and Subsets</title><link>https://tutorialedge.net/challenges/go/sets-and-subsets/</link><pubDate>Mon, 01 Jun 2020 19:47:02 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/sets-and-subsets/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you are tasked with trying to implement a function that checks to see if a set is a sub-set of another set.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be carrying on the flying theme where the function takes in a &lt;code&gt;slice&lt;/code&gt; of Flights and then checks to see if they exist within another &lt;code&gt;slice&lt;/code&gt; of flights.&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Hint&lt;/summary&gt;
&lt;p&gt;There are a number of ways to solve this. You may be able to use the &lt;code&gt;reflect&lt;/code&gt; package or you may be able to serialize each flight and create a hash of them which you can store in a hash.&lt;/p&gt;</description></item><item><title>Python Decorators Tutorial</title><link>https://tutorialedge.net/python/python-decorators-tutorial/</link><pubDate>Tue, 08 Aug 2017 18:55:48 +0100</pubDate><guid>https://tutorialedge.net/python/python-decorators-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This Tutorial was written using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, I am going to be demonstrating the wonderful concept that is
Python decorators. We&amp;rsquo;ll look at the various attributes of Python that make
writing your own decorators fairly simple and then we&amp;rsquo;ll cover some cool
examples as to how you can use decorators to improve the performance of some
types of applications.&lt;/p&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;p&gt;If you prefer, feel free to check out the video version of this course, like and
subscribe to my channel for more Python related video content!&lt;/p&gt;</description></item><item><title>Challenge 12 - Armstrong Numbers</title><link>https://tutorialedge.net/challenges/go/calculate-armstrong-number/</link><pubDate>Tue, 02 Jun 2020 18:12:42 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/calculate-armstrong-number/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you are tasked with implementing a function that checks to see whether a number is an armstrong number.&lt;/p&gt;
&lt;h2 id="armstrong-numbers"&gt;
 &lt;a href="#armstrong-numbers" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Armstrong Numbers&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Armstrong Numbers - An Armstrong number is a 3-digit number such that each of the sum of the cubes of its digits equal the number itself:&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src="https://s3.eu-west-1.amazonaws.com/images.tutorialedge.net/challenges/armstrong.png" alt="Armstrong Number" /&gt;&lt;/p&gt;
&lt;Quiz question="Can we define a method with a pointer receiver to an int type?" answer="No, if you wish to extend any type that is not local to your package then you will have to define an alias type - type ExtendedType T" correct="B" A="Yes" B="No" C="I Don't Know" /&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;math&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; MyInt &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;nptr &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;MyInt&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;IsArmstrong&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;bool&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;nptr
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; n &lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#b48ead"&gt;999&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&amp;amp;&lt;/span&gt; n &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#b48ead"&gt;100&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n1 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; &lt;span style="color:#b48ead"&gt;100&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n2 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt;&lt;span style="color:#eceff4"&gt;((&lt;/span&gt;n&lt;span style="color:#81a1c1"&gt;%&lt;/span&gt;&lt;span style="color:#b48ead"&gt;100&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; n3 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n &lt;span style="color:#81a1c1"&gt;%&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; calculated &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; math&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Pow&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n1&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; math&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Pow&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n2&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; math&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Pow&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n3&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; calculated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Armstrong Numbers&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; num1 MyInt &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;371&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;num1&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;IsArmstrong&lt;/span&gt;&lt;span style="color:#eceff4"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this challenge, you may also enjoy some of the other challenges on this site:&lt;/p&gt;</description></item><item><title>Advanced Go Testing Tutorial</title><link>https://tutorialedge.net/golang/advanced-go-testing-tutorial/</link><pubDate>Wed, 29 Aug 2018 21:57:53 +0100</pubDate><guid>https://tutorialedge.net/golang/advanced-go-testing-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;🚀 My new course - &lt;a href="./courses/go-testing-bible/"
 title="The Golang Testing Bible" 
 &gt;
 The Golang Testing Bible&lt;/a&gt; is out now and covers everything you need to get up and running creating tests for your Go applications!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;Welcome fellow coders! In this tutorial, we are going to be taking a look at
a selection of more advanced testing practices&lt;/strong&gt; used by the likes of the Go core
language developers and in popular production-level tools.&lt;/p&gt;
&lt;p&gt;I feel this approach, of actually studying what has been done in a production
system, will hopefully give you some insight into the best ways to test your own
production-level Go programs.&lt;/p&gt;</description></item><item><title>Python Generators Tutorial</title><link>https://tutorialedge.net/python/python-generator-tutorial/</link><pubDate>Mon, 12 Jun 2017 14:26:02 +0000</pubDate><guid>https://tutorialedge.net/python/python-generator-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial I&amp;rsquo;m aiming to help demystify this concept of generators within
the Python programming language. We&amp;rsquo;ll look at what generators are and how we
can utilize them within our python programs.&lt;/p&gt;
&lt;h2 id="what-are-generators"&gt;
 &lt;a href="#what-are-generators" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Are Generators?&lt;/h2&gt;
&lt;p&gt;Generators are functions that can return multiple values at different times.
These are &lt;a href="./python/python-iterator-tutorial/"
 title="iterators" 
 &gt;
 iterators&lt;/a&gt; that we can
subsequently iterate over in a variety of different ways.&lt;/p&gt;</description></item><item><title>The Go init Function</title><link>https://tutorialedge.net/golang/the-go-init-function/</link><pubDate>Fri, 20 May 2022 10:44:54 +0100</pubDate><guid>https://tutorialedge.net/golang/the-go-init-function/</guid><description>&lt;p&gt;There are times, when creating applications in Go, that you need to be able to
set up some form of state on the initial startup of your program. This could
involve creating connections to databases, or loading in configuration from
locally stored configuration files.&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be looking at how you can use this &lt;code&gt;init()&lt;/code&gt;
function to achieve this goal and we&amp;rsquo;ll also be taking a look at why this might not necessarily be the best approach to instantiating your components.&lt;/p&gt;</description></item><item><title>Challenge 13 - Smallest Difference between Ints</title><link>https://tutorialedge.net/challenges/go/smallest-difference-ints/</link><pubDate>Wed, 03 Jun 2020 19:55:24 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/smallest-difference-ints/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you are tasked with finding the smallest difference between two slices of &lt;code&gt;int&lt;/code&gt; values.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Example: Let&amp;rsquo;s say I have 2 int arrays; [1, 2] and [4, 5]. The function should return the smallest difference which would be the difference between &lt;code&gt;2&lt;/code&gt; and &lt;code&gt;4&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;sort&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CalcSmallestDifference&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr1&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; arr2 &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sort&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Ints&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr1&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; sort&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Ints&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr2&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; greater1 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; arr1&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr1&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; smaller2 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; arr2&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;greater1 &lt;span style="color:#81a1c1"&gt;&amp;gt;=&lt;/span&gt; smaller2&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; smaller2 &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; greater1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Smallest Difference Challenge&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr1 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#b48ead"&gt;9&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;8&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;7&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;6&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; arr2 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#b48ead"&gt;7&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; smallestDiff &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CalcSmallestDifference&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr1&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; arr2&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;smallestDiff&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this challenge, you may also enjoy some of the other challenges on this site:&lt;/p&gt;</description></item><item><title>An Intro to Go Dep</title><link>https://tutorialedge.net/golang/an-intro-to-go-dep/</link><pubDate>Sun, 18 Feb 2018 09:16:39 +0000</pubDate><guid>https://tutorialedge.net/golang/an-intro-to-go-dep/</guid><description>&lt;p&gt;In this tutorial, we are going to look at how you can use the &lt;code&gt;Dep&lt;/code&gt; tool in go
to manage your Go&amp;rsquo;s project dependencies.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - This article covers &lt;code&gt;dep&lt;/code&gt;, which is now deprecated. Go 1.11+ uses &lt;code&gt;go mod&lt;/code&gt; (Go Modules) for dependency management, which is the recommended approach for modern Go projects. See &lt;a href="./golang/go-modules-tutorial/"
 title="An Intro to Go Modules" 
 &gt;
 An Intro to Go Modules&lt;/a&gt; for the current standard.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="why-dep"&gt;
 &lt;a href="#why-dep" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why dep?&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;dep&lt;/code&gt; tool is the &amp;ldquo;official experiment&amp;rdquo; dependency management tool for the
go programming language. It helps you to manage the ever-growing list of
dependencies your project needs to maintain without a lot of overhead and it can
pin you to specific versions of dependencies to ensure stability in your
systems.&lt;/p&gt;</description></item><item><title>Python Iterator Tutorial</title><link>https://tutorialedge.net/python/python-iterator-tutorial/</link><pubDate>Sun, 03 Sep 2017 17:58:24 +0100</pubDate><guid>https://tutorialedge.net/python/python-iterator-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at what &lt;code&gt;iterators&lt;/code&gt; are with Python. We&amp;rsquo;ll
also be looking at how we can effectively work with them and improve our Python
programs using them.&lt;/p&gt;
&lt;h2 id="what-are-iterators"&gt;
 &lt;a href="#what-are-iterators" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Are Iterators?&lt;/h2&gt;
&lt;p&gt;Iterators are cool in the sense that they allow us to step over every item in an
array, object or file and perform work on each item. For example, we could take
the string &lt;code&gt;test&lt;/code&gt; and use an iterator to step over every character element
within that string.&lt;/p&gt;</description></item><item><title>Challenge 14 - Leap Years</title><link>https://tutorialedge.net/challenges/go/leap-years/</link><pubDate>Thu, 04 Jun 2020 21:22:55 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/leap-years/</guid><description>&lt;p&gt;👋 Welcome Gophers, in this challenge, you are tasked with implementing a function that returns whether or not a year is in fact a leap year.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CheckLeapYear&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;year &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;bool&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// If a year is multiple of 400, &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// then it is a leap year &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; year &lt;span style="color:#81a1c1"&gt;%&lt;/span&gt; &lt;span style="color:#b48ead"&gt;400&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// Else If a year is muliplt of 100, &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// then it is not a leap year &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; year &lt;span style="color:#81a1c1"&gt;%&lt;/span&gt; &lt;span style="color:#b48ead"&gt;100&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// Else If a year is muliplt of 4, &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// then it is a leap year &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; year &lt;span style="color:#81a1c1"&gt;%&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Check Leap Year&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; year &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2020&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;CheckLeapYear&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;year&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this challenge, you may also enjoy some of the other challenges on this site:&lt;/p&gt;</description></item><item><title>An Introduction to Benchmarking Your Go Programs</title><link>https://tutorialedge.net/golang/benchmarking-your-go-programs/</link><pubDate>Sat, 10 Feb 2018 08:48:40 +0000</pubDate><guid>https://tutorialedge.net/golang/benchmarking-your-go-programs/</guid><description>&lt;p&gt;In this article, we are going to be having a look at benchmarking. More
specifically, we are going to be looking at how you can benchmark your Go-based
programs.&lt;/p&gt;
&lt;p&gt;In times where performance is important, being able to benchmark how your
program performs and analyze where potential bottlenecks are, is really
valuable. By understanding where these bottlenecks lie, we can more effectively
determine where to focus our efforts in order to improve the performance of our
systems.&lt;/p&gt;</description></item><item><title>Getting Started With PyUnit Testing</title><link>https://tutorialedge.net/python/getting-started-with-pyunit-testing/</link><pubDate>Sun, 19 Nov 2017 10:18:54 +0000</pubDate><guid>https://tutorialedge.net/python/getting-started-with-pyunit-testing/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial is currently under construction.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you are starting to improve your Python development skills, the one aspect
that must be up to scratch is your ability to test your code. Unit testing your
code can help to improve the confidence you have whenever you are trying to make
any patches, bug fixes or just changes in general.&lt;/p&gt;
&lt;p&gt;If your tests adequately test that your code behaves the way you expect it to,
whenever you make a change, you can retest and ensure that your code still
behaves the way you expect it with your incorporated changes. If the tests fail
then you know that you will have to make further changes until your tests do
pass.&lt;/p&gt;</description></item><item><title>How To Consume Data From A REST HTTP API With Go</title><link>https://tutorialedge.net/golang/consuming-restful-api-with-go/</link><pubDate>Sun, 05 Jun 2022 08:56:56 +0100</pubDate><guid>https://tutorialedge.net/golang/consuming-restful-api-with-go/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; For a tutorial on how to build a RESTful API in Go, click
&lt;a href="./golang/creating-restful-api-with-golang/"
 title="here" 
 &gt;
 here&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, I&amp;rsquo;m going to demonstrate how we can consume an already
running RESTful API using Go. There are currently hundreds of open REST APIs
out there that are just waiting to be consumed and turned into something more
meaningful. Todd Motto has put together quite an active repo on GitHub that
lists all the public APIs available for consumption. He has categorized them
so that we can easily drill down to what we want to check out. You can find
that &lt;a href="https://github.com/toddmotto/public-apis"
 title="here" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 here&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Challenge 15 - Repeating Letters</title><link>https://tutorialedge.net/challenges/go/repeating-letters/</link><pubDate>Fri, 05 Jun 2020 17:56:04 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/repeating-letters/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you are tasked with implementing a function &lt;code&gt;DoubleChars&lt;/code&gt; which will take in a &lt;code&gt;string&lt;/code&gt; and then return another string which has every letter in the word doubled.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;DoubleChars&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;original &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; endString &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;([]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;rune&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;original&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; c &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; original &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; endString &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;endString&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; c&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; c&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;endString&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Repeating Letters Challenge&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; original &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;gophers&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; doubled &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;DoubleChars&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;original&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;doubled&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// ggoopphheerrss&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this challenge, you may also enjoy some of the other challenges on this site:&lt;/p&gt;</description></item><item><title>Go Maps Tutorial</title><link>https://tutorialedge.net/golang/go-maps-tutorial/</link><pubDate>Sat, 29 Jun 2019 23:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/go-maps-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to look at maps in Go and how you can use them to achieve world domination!&lt;/p&gt;
&lt;p&gt;We are going to be covering just about everything you need to know about maps to get started using them within your own Go applications. We are going to be looking at all of the various ways you interact with maps in Go and by the end of this tutorial, you will be a master when it comes to using them.&lt;/p&gt;</description></item><item><title>Creating a RESTful API With Go</title><link>https://tutorialedge.net/golang/creating-restful-api-with-golang/</link><pubDate>Sat, 07 Mar 2026 08:45:15 +0100</pubDate><guid>https://tutorialedge.net/golang/creating-restful-api-with-golang/</guid><description>&lt;p&gt;If you are writing any form of web application, then you are most likely
interfacing with 1 or more REST APIs in order to populate the dynamic
parts of your application and to perform tasks such as updating or deleting
data within a database.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;In this tutorial, you are going to be building a fully-fledged REST API&lt;/strong&gt;
that exposes &lt;code&gt;GET&lt;/code&gt;, &lt;code&gt;POST&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt; and &lt;code&gt;PUT&lt;/code&gt; endpoints that will subsequently
allow you to perform the full range of &lt;code&gt;CRUD&lt;/code&gt; operations.&lt;/p&gt;</description></item><item><title>Challenge 16 - Odd or Even Factors</title><link>https://tutorialedge.net/challenges/go/even-odd-factors/</link><pubDate>Sun, 07 Jun 2020 19:04:19 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/even-odd-factors/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you will be tasked with implementing a function that will return either &amp;ldquo;odd&amp;rdquo; or &amp;ldquo;even&amp;rdquo; depending on whether or not a number has an odd or an even number of factors.&lt;/p&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;math&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;OddEvenFactors&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;num &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; factors &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CheckFactors&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;num&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;factors&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;%&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;even&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;odd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CheckFactors&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;num &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; factors &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; num&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; limit &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;math&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Ceil&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;num&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;&amp;lt;=&lt;/span&gt; limit&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; num &lt;span style="color:#81a1c1"&gt;%&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; factors &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;factors&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; i&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; factors
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Odd or Even Factors&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; numFactors &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;OddEvenFactors&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;23&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;numFactors&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// &amp;#34;even&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; numFactors &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;OddEvenFactors&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;36&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;numFactors&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// &amp;#34;odd&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this challenge, you may also enjoy some of the other challenges on this site:&lt;/p&gt;</description></item><item><title>Building a Web Server in Go with net/http</title><link>https://tutorialedge.net/golang/creating-simple-web-server-with-golang/</link><pubDate>Wed, 27 May 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/creating-simple-web-server-with-golang/</guid><description>&lt;p&gt;Building a web server is one of the best first projects when learning a new language — it touches routing, request handling, and the standard library all at once.&lt;/p&gt;
&lt;p&gt;In Go, the &lt;a href="https://pkg.go.dev/net/http"
 title="net/http" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 &lt;code&gt;net/http&lt;/code&gt;&lt;/a&gt; package makes this surprisingly straightforward. If you&amp;rsquo;ve used Node&amp;rsquo;s Express or Python&amp;rsquo;s Flask, you&amp;rsquo;ll notice familiar patterns.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll build up from a minimal handler, add a mutex-guarded counter, serve static files, and finally secure the server with HTTPS.&lt;/p&gt;</description></item><item><title>Challenge 17 - Decode the Secret</title><link>https://tutorialedge.net/challenges/go/decode-the-secret/</link><pubDate>Mon, 08 Jun 2020 21:23:28 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/decode-the-secret/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you are tasked with decoding the secret message.&lt;/p&gt;
&lt;p&gt;You will need to implement the &lt;code&gt;DecodeSecret&lt;/code&gt; function which will take in a string that has been encoded using base64 encoding and decode this string.&lt;/p&gt;
&lt;p&gt;This decoded string will be the result of a caesar cipher which has shifted all of the characters of the string up by 1 place. So you will have to ensure that when you return the result, it also decodes this cipher.&lt;/p&gt;</description></item><item><title>Challenge 18 - Min Rotations</title><link>https://tutorialedge.net/challenges/go/min-rotations/</link><pubDate>Tue, 09 Jun 2020 20:36:23 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/min-rotations/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this challenge, you will be tasked with finding out how many rotations an ordered &lt;code&gt;int&lt;/code&gt; slice has undergone and shifted by.&lt;/p&gt;
&lt;h3 id="examples"&gt;
 &lt;a href="#examples" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Examples:&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;arr &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#88c0d0"&gt;MinRotations&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// returns 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;arr &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#88c0d0"&gt;MinRotations&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// returns 3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="see-the-solution"&gt;
 &lt;a href="#see-the-solution" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;See the Solution&lt;/h2&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;MinRotations&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;array &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// Implement me :)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	size &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;array&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; size &lt;span style="color:#81a1c1"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	lowIndex &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	middleIndex &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	highIndex &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; size &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; array&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;lowIndex&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; array&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;highIndex&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		middleIndex &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;lowIndex &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; highIndex&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; array&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;middleIndex&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; array&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;highIndex&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			lowIndex &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; middleIndex &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			highIndex &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; middleIndex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; lowIndex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Min Rotation Challenge&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	testArr &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#b48ead"&gt;15&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;18&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;6&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;12&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	min &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;MinRotations&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;testArr&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// returns 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;min&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	testArr2 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#b48ead"&gt;7&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;9&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;11&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;12&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	min2 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;MinRotations&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;testArr2&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// return 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;min2&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this challenge, you may also enjoy some of the other challenges on this site:&lt;/p&gt;</description></item><item><title>Building a Network Command Line Interface in Go</title><link>https://tutorialedge.net/golang/building-a-cli-in-go/</link><pubDate>Sun, 29 Jul 2018 09:41:15 +0100</pubDate><guid>https://tutorialedge.net/golang/building-a-cli-in-go/</guid><description>&lt;p&gt;In this article, we are going to be building a very simple Command Line
Interface in Go using the &lt;code&gt;urfave/cli&lt;/code&gt; package available on Github here:
&lt;a href="https://github.com/urfave/cli"
 title="https://github.com/urfave/cli" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 https://github.com/urfave/cli&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve been doing one or two domain migrations across various hosting providers
recently and thought it would be a cool idea to build a tool or program that
could be used to query things like the Nameservers of a website, the CNAMEs, the
IP addresses and so on.&lt;/p&gt;</description></item><item><title>Challenge 19 - Difference Between Squares</title><link>https://tutorialedge.net/challenges/go/diff-squares/</link><pubDate>Sun, 24 Nov 2019 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/challenges/go/diff-squares/</guid><description>&lt;p&gt;In this challenge, you are going to implement the &lt;code&gt;DiffSquares&lt;/code&gt; function so that it returns the difference between the first number squared minus the second number squared.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;^2 &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;^2 &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you require a hint as to how this is done, please click below:&lt;/p&gt;
&lt;details&gt;&lt;summary&gt;Hint&lt;/summary&gt;
&lt;p&gt;You can calculate powers of numbers in Go using the &lt;code&gt;math.Pow&lt;/code&gt; function. You can read more about this here: &lt;a href="https://golang.org/pkg/math/#Pow"
 title="Math Pow" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Math Pow&lt;/a&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;math&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;DiffSquares&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; m &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	x &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; math&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Pow&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n&lt;span style="color:#eceff4"&gt;),&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	y &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; math&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Pow&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;m&lt;span style="color:#eceff4"&gt;),&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;x&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;y&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Calculate The Difference of Squares&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	result &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;DiffSquares&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;result&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Further Reading:&lt;/h2&gt;
&lt;p&gt;If you like this challenge then you may also appreciate some of the following articles on the site:&lt;/p&gt;</description></item><item><title>Writing A Twitter Bot in Go</title><link>https://tutorialedge.net/golang/writing-a-twitter-bot-golang/</link><pubDate>Sun, 09 Apr 2017 21:33:19 +0100</pubDate><guid>https://tutorialedge.net/golang/writing-a-twitter-bot-golang/</guid><description>&lt;p&gt;In this tutorial I’m going to be demonstrating how to build a twitter bot using
&lt;a href="https://github.com/dghubble/go-twitter"
 title="go-twitter" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 go-twitter&lt;/a&gt;, a popular Go
client library for the Twitter API.&lt;/p&gt;
&lt;p&gt;I’ll be demonstrating how you can build a go based twitter bot that will be able
to do such things as automatically reply to tweets and favorite tweets that
contain a specific hashtag.&lt;/p&gt;
&lt;h2 id="setting-up-your-project"&gt;
 &lt;a href="#setting-up-your-project" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Setting Up Your Project&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; We&amp;rsquo;ll be using go modules, which is now the standard dependency
management tool in Go 1.11 and later&lt;/p&gt;</description></item><item><title>Challenge 20 - Finding the nth Triangular Number</title><link>https://tutorialedge.net/challenges/go/triangular-numbers/</link><pubDate>Sun, 24 Nov 2019 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/challenges/go/triangular-numbers/</guid><description>&lt;p&gt;In this challenge, you are going to implement the &lt;code&gt;TriangularNumbers&lt;/code&gt; function which takes in &lt;code&gt;n&lt;/code&gt; and returns the &lt;code&gt;nth&lt;/code&gt; triangular number.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="see-the-solution"&gt;
 &lt;a href="#see-the-solution" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;See the Solution&lt;/h2&gt;
&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;TriangularNumber&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n&lt;span style="color:#81a1c1"&gt;+&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Returning the &amp;#39;nth&amp;#39; triangular number&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; number &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;TriangularNumber&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;number&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// &amp;#39;6&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h2 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Further Reading:&lt;/h2&gt;
&lt;p&gt;If you like this challenge then you may also appreciate some of the following articles on the site:&lt;/p&gt;</description></item><item><title>Python Based Lambda Tutorial</title><link>https://tutorialedge.net/cloud/aws/python-based-lambda-tutorial/</link><pubDate>Sat, 24 Feb 2018 10:23:36 +0000</pubDate><guid>https://tutorialedge.net/cloud/aws/python-based-lambda-tutorial/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been following my &lt;a href="https://medium.com/@elliot_f"
 title="Medium Blog" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Medium Blog&lt;/a&gt;
recently, you&amp;rsquo;ll know that I&amp;rsquo;m a huge fan of Serverless and I genuinely believe
that it will start to seriously take off in terms of popularity in the years to
come.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be writing a very simple Python based AWS
Lambda function that we&amp;rsquo;ll then deploy using the
&lt;a href="https://serverless.com/"
 title="serverless.com" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 serverless.com&lt;/a&gt; CLI.&lt;/p&gt;
&lt;h2 id="installing-serverless"&gt;
 &lt;a href="#installing-serverless" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Installing Serverless&lt;/h2&gt;
&lt;p&gt;In order to install the &lt;code&gt;serverless&lt;/code&gt; CLI you can do the following:&lt;/p&gt;</description></item><item><title>Go ORM Tutorial</title><link>https://tutorialedge.net/golang/golang-orm-tutorial/</link><pubDate>Wed, 07 Feb 2018 20:57:06 +0000</pubDate><guid>https://tutorialedge.net/golang/golang-orm-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to look at how we can use the &lt;code&gt;Go-ORM&lt;/code&gt; or &lt;code&gt;GORM&lt;/code&gt;
to interact with a &lt;code&gt;sqlite3&lt;/code&gt; database in a simple manner.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;ORM&lt;/code&gt;s or Object Relationship Managers act almost as brokers between us
developers and our underlying database technology. They allow us to essentially
work with objects, much as we normally would and then save these objects
without having to craft complex &lt;code&gt;SQL&lt;/code&gt; statements.&lt;/p&gt;
&lt;p&gt;They effectively reduce the complexity of our codebase in scenarios where you
don&amp;rsquo;t wish to work with &lt;code&gt;SQL&lt;/code&gt; but need a database.&lt;/p&gt;</description></item><item><title>Challenge 21 - JSON and Stock Dividends</title><link>https://tutorialedge.net/challenges/go/working-with-json/</link><pubDate>Sun, 02 Aug 2020 21:08:18 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/working-with-json/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this Go challenge, you are going to be working with JSON data and implementing a function that takes in a JSON string full of stock quotes and returns the one with the highest dividend return.&lt;/p&gt;
&lt;p&gt;You will need to implement the &lt;code&gt;HighestDividend&lt;/code&gt; function so that it takes in a &lt;code&gt;JSON&lt;/code&gt; string. You will then need to somehow convert this JSON string into something you can traverse in Go using the &lt;code&gt;encoding/json&lt;/code&gt; package.&lt;/p&gt;</description></item><item><title>Go MySQL Tutorial</title><link>https://tutorialedge.net/golang/golang-mysql-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:28:15 +0100</pubDate><guid>https://tutorialedge.net/golang/golang-mysql-tutorial/</guid><description>&lt;p&gt;As you continue your Golang learning journey, it becomes almost inevitable that
you will have to interact with some form of database.&lt;/p&gt;
&lt;p&gt;In this tutorial I’ll be demonstrating how you can connect to a MySQL database
and perform basic SQL statements using Go.&lt;/p&gt;
&lt;h2 id="why-mysql"&gt;
 &lt;a href="#why-mysql" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why MySQL?&lt;/h2&gt;
&lt;p&gt;MySQL is one of the most well-known and well-used database technologies
available to developers at the present point in time. It has an absolutely
massive community around it and it&amp;rsquo;s quite possibly powering half the web as the
main database technology for Wordpress.&lt;/p&gt;</description></item><item><title>Concurrency in Go: Goroutines Explained</title><link>https://tutorialedge.net/golang/concurrency-with-golang-goroutines/</link><pubDate>Wed, 27 May 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/concurrency-with-golang-goroutines/</guid><description>&lt;p&gt;Go is a highly performant language built for concurrency. It redefines concurrent programming through &lt;code&gt;goroutines&lt;/code&gt; and &lt;code&gt;channels&lt;/code&gt; — lightweight primitives managed by the Go runtime.&lt;/p&gt;
&lt;p&gt;Using goroutines turns a sequential program into a concurrent one without managing threads or thread-pools.&lt;/p&gt;
&lt;p&gt;But concurrency comes with dangers. Before adding the &lt;code&gt;go&lt;/code&gt; keyword to every function call, it&amp;rsquo;s worth understanding how goroutines work and where they can go wrong.&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll look at how to use &lt;code&gt;goroutines&lt;/code&gt; in Go programs and improve the performance of your applications.&lt;/p&gt;</description></item><item><title>Challenge 22 - Largest Pandigital Prime</title><link>https://tutorialedge.net/challenges/go/pandigital-numbers/</link><pubDate>Tue, 09 Jun 2020 20:36:23 +0100</pubDate><guid>https://tutorialedge.net/challenges/go/pandigital-numbers/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Problem Attribution&lt;/strong&gt; - This challenge was inspired by Problem 41 on &lt;a href="https://projecteuler.net/problem=41"
 title="Project Euler" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Project Euler&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;👋 Welcome Gophers! In this challenge, you are tasked with implementing the &lt;code&gt;LargestPandigitalPrime&lt;/code&gt; function which will return the largest possible pandigital prime number.&lt;/p&gt;
&lt;h2 id="pandigital-primes"&gt;
 &lt;a href="#pandigital-primes" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Pandigital Primes&lt;/h2&gt;
&lt;p&gt;An n-digit number is pandigital if it makes use of all the digits &lt;code&gt;1 to n&lt;/code&gt; exactly ones.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;pandigital &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;LargestPandigitalPrime&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// returns largest pandigital prime &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;details&gt;
&lt;summary&gt;View Solution&lt;/summary&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;math&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;strconv&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;notPrime&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;bool&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; n&lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;%&lt;/span&gt;&lt;span style="color:#b48ead"&gt;6&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n&lt;span style="color:#81a1c1"&gt;+&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;%&lt;/span&gt;&lt;span style="color:#b48ead"&gt;6&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;isPrime&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;bool&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;notPrime&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	max &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;math&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Ceil&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;math&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Sqrt&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;n&lt;span style="color:#eceff4"&gt;))))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;);&lt;/span&gt; i &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt; max&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; n&lt;span style="color:#81a1c1"&gt;%&lt;/span&gt;i &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;atoi&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	n&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; _ &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; strconv&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Atoi&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; n
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;permute&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;s&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	perms &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	head &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;])&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	tail &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; s&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; perm &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;permute&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;tail&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s&lt;span style="color:#eceff4"&gt;);&lt;/span&gt; i&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			newperm &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; perm&lt;span style="color:#eceff4"&gt;[:&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; head &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; perm&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;:]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			perms &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;perms&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; newperm&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; perms
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;LargestPandigitalPrime&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	max &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	digits &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;7654321&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;digits&lt;span style="color:#eceff4"&gt;);&lt;/span&gt; i&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; perm &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;permute&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;digits&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;:])&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			i &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;atoi&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;perm&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;isPrime&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;i&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; i &lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; max &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;					max &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; i
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; max &lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#81a1c1;font-weight:bold"&gt;break&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; max
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Pandigital Primes&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; pandigitalPrime &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;LargestPandigitalPrime&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;pandigitalPrime&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/details&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this challenge, you may also like some of the other challenges on the site!&lt;/p&gt;</description></item><item><title>Go Mutex Tutorial</title><link>https://tutorialedge.net/golang/go-mutex-tutorial/</link><pubDate>Sat, 25 Aug 2018 14:21:04 +0100</pubDate><guid>https://tutorialedge.net/golang/go-mutex-tutorial/</guid><description>&lt;p&gt;The use of Go when programming highly concurrent applications doesn&amp;rsquo;t prevent you from writing a system that can feature race conditions. These race conditions can cause unexpected issues with your systems that are both hard to debug and at times, even harder to fix.&lt;/p&gt;
&lt;p&gt;Thus, we need to be able to write Go programs that can execute concurrently in a
safe manner without impacting performance. This is where the &lt;code&gt;mutex&lt;/code&gt; comes into
play.&lt;/p&gt;</description></item><item><title>Go Channels Tutorial</title><link>https://tutorialedge.net/golang/go-channels-tutorial/</link><pubDate>Sat, 07 Mar 2026 14:47:06 +0100</pubDate><guid>https://tutorialedge.net/golang/go-channels-tutorial/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, we are going to be looking at how you can use
channels within your Go-based applications.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Channels are pipes that link between &lt;code&gt;goroutines&lt;/code&gt; within your Go based
applications that allow communication and subsequently the passing of values to
and from variables.&lt;/p&gt;
&lt;p&gt;They are incredibly handy and can help you craft incredibly high performance,
highly concurrent applications in Go with minimal fuss compared to other
programming languages. This was by no means a fluke, when designing the
language, the core developers decided that they wanted concurrency within their
language to be a first class citizen and to make it as simple to work with as
possible, without going too far and not allowing developers the freedom they
need to work in.&lt;/p&gt;</description></item><item><title>Working with Websockets and Socket.IO in Go - Tutorial</title><link>https://tutorialedge.net/golang/golang-websockets-tutorial/</link><pubDate>Wed, 23 Aug 2017 19:29:11 +0100</pubDate><guid>https://tutorialedge.net/golang/golang-websockets-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This tutorial was written using Go version 1.9 and
&lt;a href="https://github.com/googollee/go-socket.io"
 title="googollee/go-socket.io" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 googollee/go-socket.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Websockets are something I find interesting in the sense that they provide us
with an alternative option to communication between applications as opposed to
the standard RESTful API solution. With Sockets we can do cool things such as
real-time communication between thousands to hundreds of thousands of different
clients without having to incur the expense of hundreds of thousands of RESTful
API calls hitting our servers every minute.&lt;/p&gt;</description></item><item><title>Go Protocol Buffer Tutorial</title><link>https://tutorialedge.net/golang/go-protocol-buffer-tutorial/</link><pubDate>Sat, 01 Sep 2018 18:53:06 +0100</pubDate><guid>https://tutorialedge.net/golang/go-protocol-buffer-tutorial/</guid><description>&lt;p&gt;Welcome fellow coders! In this tutorial, we are going to be looking at how you
can utilize the Protocol Buffers data format within your Go-based applications.
We&amp;rsquo;ll be covering what the data format is, and why it is an improvement over
more traditional data formats such as XML or even JSON. And we&amp;rsquo;ll dive into a
simple example to get us up and running before trying our hands at a more
complex example.&lt;/p&gt;</description></item><item><title>Go WebAssembly Tutorial - Building a Calculator Tutorial</title><link>https://tutorialedge.net/golang/go-webassembly-tutorial/</link><pubDate>Sat, 25 Aug 2018 15:54:23 +0100</pubDate><guid>https://tutorialedge.net/golang/go-webassembly-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Update&lt;/strong&gt; - The code in this tutorial has been updated to work with the breaking changes in Go v1.12&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome All! With Go v1.11 having just been released with an experimental port
to WebAssembly included, I thought it would be awesome to see how we can write
our own Go programs that compile straight to WebAssembly!&lt;/p&gt;
&lt;p&gt;So, in this article, we are going to be building a really simple calculator to
give us an idea as to how we can write functions that can be exposed to the
frontend, evaluate DOM elements and subsequently update any DOM elements with
the results from any functions we call.&lt;/p&gt;</description></item><item><title>Go Oauth2 Tutorial</title><link>https://tutorialedge.net/golang/go-oauth2-tutorial/</link><pubDate>Mon, 10 Sep 2018 20:04:14 +0100</pubDate><guid>https://tutorialedge.net/golang/go-oauth2-tutorial/</guid><description>&lt;p&gt;Welcome fellow coders! In this tutorial, we are going to be taking a look at how
you can implement your own OAuth2 Server and client using the
&lt;a href="https://github.com/go-oauth2/oauth2"
 title="go-oauth2/oauth2" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 go-oauth2/oauth2&lt;/a&gt; package.&lt;/p&gt;
&lt;p&gt;This is without a doubt one of the most requested topics from commentors on my
YouTube videos and it&amp;rsquo;s certainly something that I myself find incredibly
interesting.&lt;/p&gt;
&lt;p&gt;Security is without doubt a very important feature for any public and even
private facing service or API and it&amp;rsquo;s something that you need to pay a lot of
attention to in order to get it right.&lt;/p&gt;</description></item><item><title>Go Face Recognition Tutorial - Part 1</title><link>https://tutorialedge.net/golang/go-face-recognition-tutorial-part-one/</link><pubDate>Thu, 27 Sep 2018 10:48:51 +0100</pubDate><guid>https://tutorialedge.net/golang/go-face-recognition-tutorial-part-one/</guid><description>&lt;p&gt;The whole area of Face Recognition is something I love reading about.
Implementing a facial recognition system yourself makes you sound like you are
Tony Stark and you can use them for a variety of different projects such as an
automatic lock on your door, or building a surveillance system for your office
to name but a few.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be building our own, really simple face
recognition based system in Go using a few existing libraries. We&amp;rsquo;ll start by
doing simple face recognition on still images and seeing how that works and
we&amp;rsquo;ll then be expanding upon this to look into real-time face recognition on
video feeds in part 2 of this mini-series.&lt;/p&gt;</description></item><item><title>Go Unsafe Package Tutorial</title><link>https://tutorialedge.net/golang/go-unsafe-package-tutorial/</link><pubDate>Sat, 06 Oct 2018 14:50:30 +0100</pubDate><guid>https://tutorialedge.net/golang/go-unsafe-package-tutorial/</guid><description>&lt;p&gt;In this tutorial, we&amp;rsquo;re going to explore Go&amp;rsquo;s &lt;code&gt;unsafe&lt;/code&gt; package - a powerful but dangerous set of tools that let you work directly with memory. Before we dive in, let&amp;rsquo;s be clear: the unsafe package bypasses Go&amp;rsquo;s type safety and memory safety guarantees. You should rarely need it in your day-to-day code, but when you do, it&amp;rsquo;s invaluable. Let&amp;rsquo;s see what we can do with it.&lt;/p&gt;
&lt;h2 id="introduction-to-unsafe"&gt;
 &lt;a href="#introduction-to-unsafe" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction to unsafe&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;unsafe&lt;/code&gt; package exists because sometimes you need to break the rules. Maybe you&amp;rsquo;re interfacing with C code via cgo, implementing a high-performance serialization library, or optimizing a critical path. The unsafe package gives you access to the underlying memory layout of your data structures.&lt;/p&gt;</description></item><item><title>Go Encryption and Decryption using AES - Tutorial</title><link>https://tutorialedge.net/golang/go-encrypt-decrypt-aes-tutorial/</link><pubDate>Tue, 20 Nov 2018 07:56:42 +0000</pubDate><guid>https://tutorialedge.net/golang/go-encrypt-decrypt-aes-tutorial/</guid><description>&lt;h2 id="objectives"&gt;
 &lt;a href="#objectives" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Objectives&lt;/h2&gt;
&lt;p&gt;By the end of this tutorial, you will be able to&amp;hellip;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Encrypt text using the AES - Advanced Encryption Standard in Go&lt;/li&gt;
&lt;li&gt;We&amp;rsquo;ll then look at writing this encrypted message to a file&lt;/li&gt;
&lt;li&gt;Finally we&amp;rsquo;ll look at how we can decrypt this message using a shared secret&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;From this, you should be able to build your own simple encryption systems that
can do various things like, encrypt files on your file system and protect them
with a passphrase only you know or add simple encryption to various parts of the
systems that you are working on.&lt;/p&gt;</description></item><item><title>Building a Solid Continuous Integration Pipeline with TravisCI for Your Go Projects</title><link>https://tutorialedge.net/golang/building-ci-cd-pipeline-go-projects/</link><pubDate>Tue, 16 Oct 2018 20:10:30 +0100</pubDate><guid>https://tutorialedge.net/golang/building-ci-cd-pipeline-go-projects/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - Travis CI has significantly reduced its free tier for open-source projects since this article was written. For a modern alternative, check out our guide on &lt;a href="./golang/github-actions-for-go-projects/"
 title="GitHub Actions for Go Projects" 
 &gt;
 GitHub Actions for Go Projects&lt;/a&gt; which is now the recommended CI/CD approach for Go projects hosted on GitHub.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, I recently partook in
&lt;a href="https://hacktoberfest.digitalocean.com/"
 title="Hacktoberfest" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Hacktoberfest&lt;/a&gt; which is an event that
helps to support thousands of different Open Source projects. Usually, I tend to
get caught up in other projects or can&amp;rsquo;t find the time or make up a hundred
other excuses for not taking part.&lt;/p&gt;</description></item><item><title>Cloud Development</title><link>https://tutorialedge.net/course/cloud/</link><pubDate>Sun, 08 Jul 2018 09:25:32 +0100</pubDate><guid>https://tutorialedge.net/course/cloud/</guid><description>&lt;h4 id="course-outline"&gt;
 &lt;a href="#course-outline" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Course Outline&lt;/h4&gt;
&lt;p&gt;The world is moving towards using the cloud. It&amp;rsquo;s undeniable. We have thousands
of companies, at all levels of development, starting to look at, and investigate
the advantages of migrating their software to become cloud native and to
leverage the services of providers such as AWS, Microsoft Azure and Google&amp;rsquo;s own
Cloud platform.&lt;/p&gt;
&lt;p&gt;These companies are moving away from the burden of maintaining their own
Physical infrastructure and by migrating their systems to the cloud, and
subsequently, they can leverage hundreds, if not thousands of years of
collective development expertise supporting the machines and systems they run on
top of and focus more on delivering key functionality to their customers.&lt;/p&gt;</description></item><item><title>Computer Science Fundamentals</title><link>https://tutorialedge.net/course/compsci/</link><pubDate>Sun, 08 Jul 2018 09:25:32 +0100</pubDate><guid>https://tutorialedge.net/course/compsci/</guid><description>&lt;h4 id="course-outline"&gt;
 &lt;a href="#course-outline" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Course Outline&lt;/h4&gt;
&lt;p&gt;In this course, we are going to look at the basic data structures and how you
can use them to implement the various fundamental sorting algorithms!&lt;/p&gt;</description></item><item><title>Go</title><link>https://tutorialedge.net/course/golang/</link><pubDate>Sun, 08 Jul 2018 09:25:32 +0100</pubDate><guid>https://tutorialedge.net/course/golang/</guid><description>&lt;h4 id="course-outline"&gt;
 &lt;a href="#course-outline" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Course Outline&lt;/h4&gt;
&lt;p&gt;In this course, we are going to be taking a look at how you can get started with
the Go programming language.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Go Challenges&lt;/strong&gt; - Interested in learning Go through practical examples? Then check out my list of &lt;a href="./challenges/go/"
 title="Go Challenges" 
 &gt;
 Go Challenges&lt;/a&gt; that are now available on the site!&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Caching in System Design</title><link>https://tutorialedge.net/software-eng/caching-in-system-design/</link><pubDate>Sat, 20 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/software-eng/caching-in-system-design/</guid><description>&lt;p&gt;Caching trades memory and freshness for speed and reduced load. By storing a copy of frequently accessed data closer to the consumer, you serve repeated requests without touching the primary data store.&lt;/p&gt;
&lt;p&gt;At scale, caching is one of the highest-leverage tools available. A database query that takes 20ms on a cold path takes under 1ms when served from Redis. That difference compounds across millions of requests per day.&lt;/p&gt;
&lt;p&gt;Caches live at many layers. Client-side caches store data in the browser or mobile app. CDN caches hold static assets and rendered pages at the edge.&lt;/p&gt;</description></item><item><title>Consistency and the CAP Theorem: A System Design Guide</title><link>https://tutorialedge.net/software-eng/consistency-and-the-cap-theorem/</link><pubDate>Sat, 20 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/software-eng/consistency-and-the-cap-theorem/</guid><description>&lt;p&gt;The CAP theorem is the first concept most interviewers reach for when probing your knowledge of distributed systems. It frames every data store decision you will ever make at scale.&lt;/p&gt;
&lt;p&gt;Proposed by Eric Brewer in 2000 and later formalised as a theorem, CAP says a distributed data store can guarantee at most two of three properties: Consistency, Availability, and Partition tolerance. You cannot have all three.&lt;/p&gt;
&lt;p&gt;This guide explains what each property actually means, what the real tradeoff looks like in practice, and how to talk about it confidently when an interviewer asks.&lt;/p&gt;</description></item><item><title>Database Replication Explained</title><link>https://tutorialedge.net/software-eng/database-replication-explained/</link><pubDate>Sat, 20 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/software-eng/database-replication-explained/</guid><description>&lt;p&gt;Database replication is the process of keeping copies of the same data on multiple nodes. It is one of the most fundamental tools for building systems that are fast, resilient, and always on.&lt;/p&gt;
&lt;p&gt;Replication solves three problems at once. It scales reads by spreading queries across nodes, improves availability by removing single points of failure, and improves durability so data survives the loss of any one machine.&lt;/p&gt;
&lt;p&gt;This guide explains the core patterns, the real tradeoffs, and how to reason about them clearly in an interview.&lt;/p&gt;</description></item><item><title>Database Sharding and Partitioning</title><link>https://tutorialedge.net/software-eng/database-sharding-and-partitioning/</link><pubDate>Sat, 20 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/software-eng/database-sharding-and-partitioning/</guid><description>&lt;p&gt;Vertical scaling - adding more CPU, RAM, or faster disks to one machine - has hard limits. Once you hit them, no single node can hold all your data or serve all your writes.&lt;/p&gt;
&lt;p&gt;Sharding solves this by splitting one dataset across many nodes. Each node holds a subset of the rows, so the write load and storage are distributed rather than concentrated.&lt;/p&gt;
&lt;p&gt;The terms are easy to confuse. &lt;strong&gt;Partitioning&lt;/strong&gt; means dividing a table into logical segments; &lt;strong&gt;sharding&lt;/strong&gt; means spreading those partitions across separate physical machines or nodes. Sharding is partitioning taken to a distributed level.&lt;/p&gt;</description></item><item><title>Message Queues in System Design</title><link>https://tutorialedge.net/software-eng/message-queues-in-system-design/</link><pubDate>Sat, 20 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/software-eng/message-queues-in-system-design/</guid><description>&lt;p&gt;When services call each other synchronously, they are tightly coupled. If the downstream service is slow, the caller blocks. If it is down, the caller fails.&lt;/p&gt;
&lt;p&gt;A message queue breaks that coupling by placing an asynchronous buffer between the two. The producer writes a message and moves on immediately. The consumer reads it whenever it is ready.&lt;/p&gt;
&lt;p&gt;This decoupling is what makes queues one of the most common components in large-scale system design.&lt;/p&gt;</description></item><item><title>How to Make Your Pull Requests Easy to Review</title><link>https://tutorialedge.net/software-eng/make-your-pull-requests-easy-to-review/</link><pubDate>Wed, 17 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/software-eng/make-your-pull-requests-easy-to-review/</guid><description>&lt;p&gt;Code review is about to become your team&amp;rsquo;s biggest bottleneck. Everyone is shipping AI-generated pull requests now, which means three times the diffs hitting the same number of reviewers. The queue grows, nothing merges, and your velocity quietly grinds to a halt. In this tutorial we&amp;rsquo;ll fix that from the author&amp;rsquo;s side: instead of hoping a human catches everything, you bake a set of adversarial review &lt;em&gt;rules&lt;/em&gt; into your own change &lt;em&gt;before&lt;/em&gt; anyone else looks at it. We&amp;rsquo;ll cover three rules - keep the diff small, attack your own code, and ship observability - with Go examples for each.&lt;/p&gt;</description></item><item><title>MCP Server Security in Go — Hardening Your Server</title><link>https://tutorialedge.net/ai/mcp-server-security-in-go/</link><pubDate>Wed, 10 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/mcp-server-security-in-go/</guid><description>&lt;p&gt;In &lt;a href="./ai/building-an-mcp-server-in-go/"
 title="Building an MCP Server in Go" 
 &gt;
 Building an MCP Server in Go&lt;/a&gt; we built a small &lt;a href="https://modelcontextprotocol.io"
 title="Model Context Protocol" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Model Context Protocol&lt;/a&gt; server that exposed a tool to an AI assistant. In this tutorial we&amp;rsquo;re going to attack one — and then harden it.&lt;/p&gt;
&lt;p&gt;That framing matters. An MCP server sits between an AI model and your real filesystem, your APIs, and your data. And the thing deciding what arguments hit your tools is a language model, which can be manipulated by anything it has read. So the job is the same one web developers have had for twenty years: treat input as untrusted, sanitise output, and grant the least privilege you can get away with.&lt;/p&gt;</description></item><item><title>Build Your First AI Agent in Go with the ADK</title><link>https://tutorialedge.net/ai/build-your-first-ai-agent-in-go-with-adk/</link><pubDate>Tue, 09 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/build-your-first-ai-agent-in-go-with-adk/</guid><description>&lt;p&gt;Google&amp;rsquo;s &lt;a href="https://github.com/google/adk-go"
 title="Agent Development Kit" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Agent Development Kit&lt;/a&gt; (ADK) just got a Go version, and in this tutorial we&amp;rsquo;re going to use it to build your first AI agent from scratch. It&amp;rsquo;s a surprisingly small amount of code: a Gemini model doing the thinking, an agent wrapping it with an instruction, a session to hold the conversation, and a runner to drive everything. By the end you&amp;rsquo;ll have a working agent that answers a question in your terminal — and you&amp;rsquo;ll understand each of the four pieces well enough to start bending them to your own purposes.&lt;/p&gt;</description></item><item><title>Building an MCP Server in Go</title><link>https://tutorialedge.net/ai/building-an-mcp-server-in-go/</link><pubDate>Sun, 07 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/building-an-mcp-server-in-go/</guid><description>&lt;p&gt;In this tutorial, we&amp;rsquo;re going to build a &lt;a href="https://modelcontextprotocol.io"
 title="Model Context Protocol" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Model Context Protocol&lt;/a&gt; (MCP) server in Go from scratch. MCP is the standard that lets AI assistants like Claude call out to your own code — your APIs, your databases, your search indexes — in a consistent way. By the end you&amp;rsquo;ll have a small but complete server that exposes a &lt;code&gt;search_tutorials&lt;/code&gt; tool, handles tool calls, and serves over stdio so any MCP client can connect to it.&lt;/p&gt;</description></item><item><title>Arrays &amp; Slices</title><link>https://tutorialedge.net/courses/interactive-go/10-arrays-and-slices/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/10-arrays-and-slices/</guid><description>&lt;p&gt;Adventurers need to carry their spoils. A &lt;strong&gt;slice&lt;/strong&gt; is Go&amp;rsquo;s flexible, growable list. You can create one with a literal, index into it, and grow it with &lt;code&gt;append&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;party &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Elara&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Aragorn&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;party &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;party&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Gimli&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// [Elara Aragorn Gimli]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;party&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;])&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// Elara&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;(An &lt;em&gt;array&lt;/em&gt; has a fixed size, like &lt;code&gt;[3]string{...}&lt;/code&gt;; a &lt;em&gt;slice&lt;/em&gt; wraps an array and can grow — slices are what you&amp;rsquo;ll use almost all the time.)&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Add &lt;code&gt;&amp;quot;potion&amp;quot;&lt;/code&gt; to the &lt;code&gt;backpack&lt;/code&gt; slice with &lt;code&gt;append&lt;/code&gt;, then print the whole backpack.&lt;/p&gt;</description></item><item><title>Capstone: The Final Battle</title><link>https://tutorialedge.net/courses/interactive-go/28-the-final-battle/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/28-the-final-battle/</guid><description>&lt;p&gt;This is it, adventurer — the final battle, and the end of your journey through Go. This capstone weaves together everything you&amp;rsquo;ve forged along the way: a &lt;strong&gt;struct&lt;/strong&gt; for your combatants, a &lt;strong&gt;method&lt;/strong&gt; with a &lt;strong&gt;pointer receiver&lt;/strong&gt; to land blows, a &lt;strong&gt;slice&lt;/strong&gt; of monsters, and &lt;strong&gt;nested loops&lt;/strong&gt; to see the fight through.&lt;/p&gt;
&lt;p&gt;The hero faces a line of monsters. Each must be worn down to &lt;code&gt;0&lt;/code&gt; HP before moving to the next. (These monsters have &lt;code&gt;Atk: 0&lt;/code&gt;, so the hero fights on unscathed — claim your victory.)&lt;/p&gt;</description></item><item><title>Channels</title><link>https://tutorialedge.net/courses/interactive-go/25-channels/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/25-channels/</guid><description>&lt;p&gt;Goroutines need a safe way to talk to each other. A &lt;strong&gt;channel&lt;/strong&gt; is a typed pipe: one goroutine sends a value with &lt;code&gt;ch &amp;lt;- v&lt;/code&gt;, another receives it with &lt;code&gt;&amp;lt;-ch&lt;/code&gt;.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ch &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt; ch &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt; &lt;span style="color:#b48ead"&gt;42&lt;/span&gt; &lt;span style="color:#eceff4"&gt;}()&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// send&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;n &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt;ch &lt;span style="color:#616e87;font-style:italic"&gt;// receive (blocks until a value arrives)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Sends and receives block until the other side is ready, which neatly synchronises the two goroutines — no locks required.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Launch a goroutine that sends &lt;code&gt;&amp;quot;Victory!&amp;quot;&lt;/code&gt; into the &lt;code&gt;messages&lt;/code&gt; channel. The &lt;code&gt;&amp;lt;-messages&lt;/code&gt; receive already in place will print it.&lt;/p&gt;</description></item><item><title>Constants &amp; iota</title><link>https://tutorialedge.net/courses/interactive-go/04-constants/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/04-constants/</guid><description>&lt;p&gt;Some values should never change mid-quest — the size of your backpack, the name of your guild. For these, Go gives you &lt;code&gt;const&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; maxInventory &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;When you need a run of related constants, &lt;code&gt;iota&lt;/code&gt; numbers them for you, starting at &lt;code&gt;0&lt;/code&gt; and incrementing for each line:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Bronze &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;iota&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Silver &lt;span style="color:#616e87;font-style:italic"&gt;// 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Gold &lt;span style="color:#616e87;font-style:italic"&gt;// 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Define a constant block using &lt;code&gt;iota&lt;/code&gt; for three ranks — &lt;code&gt;Novice&lt;/code&gt;, &lt;code&gt;Squire&lt;/code&gt;, and &lt;code&gt;Knight&lt;/code&gt; — so that &lt;code&gt;Knight&lt;/code&gt; has the value &lt;code&gt;2&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Defer</title><link>https://tutorialedge.net/courses/interactive-go/15-defer/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/15-defer/</guid><description>&lt;p&gt;&lt;code&gt;defer&lt;/code&gt; schedules a call to run when the surrounding function returns — perfect for cleanup you don&amp;rsquo;t want to forget (closing a file, releasing a lock, snuffing a torch).&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;readScroll&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;defer&lt;/span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;scroll rolled back up&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;reading the scroll...&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Deferred calls run in &lt;strong&gt;LIFO&lt;/strong&gt; order — the last one deferred runs first. So if you defer two things, they unwind in reverse.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Add a deferred print of &lt;code&gt;Torch extinguished.&lt;/code&gt; Because deferred calls run last and in reverse order, the output should be:&lt;/p&gt;</description></item><item><title>Error Handling</title><link>https://tutorialedge.net/courses/interactive-go/22-error-handling/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/22-error-handling/</guid><description>&lt;p&gt;Go doesn&amp;rsquo;t use exceptions. Instead, functions that can fail return an &lt;code&gt;error&lt;/code&gt; as their last value, and you check it right away. This is the famous &lt;code&gt;if err != nil&lt;/code&gt; idiom:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;doRisky&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;it failed:&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// safe to use result here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A &lt;code&gt;nil&lt;/code&gt; error means success. You create errors with &lt;code&gt;errors.New(&amp;quot;message&amp;quot;)&lt;/code&gt; or &lt;code&gt;fmt.Errorf(&amp;quot;got %d&amp;quot;, n)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;drink(0)&lt;/code&gt; returns an error. Check &lt;code&gt;err&lt;/code&gt;: if it&amp;rsquo;s not &lt;code&gt;nil&lt;/code&gt;, print the error; otherwise print &lt;code&gt;Potion drunk!&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>For Loops</title><link>https://tutorialedge.net/courses/interactive-go/08-for-loops/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/08-for-loops/</guid><description>&lt;p&gt;Go keeps things simple: it has exactly &lt;strong&gt;one&lt;/strong&gt; loop keyword, &lt;code&gt;for&lt;/code&gt;, which covers every looping need. The classic three-part form has an init, a condition, and a post statement:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;swing&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; i&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Drop the init and post and it behaves like a &lt;code&gt;while&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; health &lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; health &lt;span style="color:#81a1c1"&gt;-=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And &lt;code&gt;for ... range&lt;/code&gt; walks over a slice or map (you&amp;rsquo;ll use this a lot soon):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; index&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; item &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; backpack &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;index&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; item&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Use a &lt;code&gt;for&lt;/code&gt; loop to print the numbers &lt;code&gt;1&lt;/code&gt; to &lt;code&gt;5&lt;/code&gt;, one per line.&lt;/p&gt;</description></item><item><title>Functions Revisited</title><link>https://tutorialedge.net/courses/interactive-go/13-functions/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/13-functions/</guid><description>&lt;p&gt;Functions are how you package up a spell to cast again and again. You&amp;rsquo;ve called them already — now let&amp;rsquo;s wield them properly. A Go function declares its parameters and its return type(s):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;heal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;amount &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; amount &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A real strength of Go is &lt;strong&gt;multiple return values&lt;/strong&gt; — perfect for returning a result &lt;em&gt;and&lt;/em&gt; a status together:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;divide&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;a&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; b &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;bool&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; b &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; a &lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; b&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;result&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; ok &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;divide&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can even name the return values for clarity (&lt;code&gt;func attack() (damage int, crit bool)&lt;/code&gt;), though we&amp;rsquo;ll keep it simple here.&lt;/p&gt;</description></item><item><title>Goroutines</title><link>https://tutorialedge.net/courses/interactive-go/24-goroutines/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/24-goroutines/</guid><description>&lt;p&gt;A &lt;strong&gt;goroutine&lt;/strong&gt; is a lightweight thread of execution. Put &lt;code&gt;go&lt;/code&gt; in front of a function call and it runs concurrently, while the rest of your code carries on:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;scout&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// runs in the background&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The catch: &lt;code&gt;main&lt;/code&gt; won&amp;rsquo;t wait for goroutines on its own — if it returns, they&amp;rsquo;re cut short. A &lt;code&gt;sync.WaitGroup&lt;/code&gt; lets you wait: &lt;code&gt;Add&lt;/code&gt; how many you expect, &lt;code&gt;Done&lt;/code&gt; as each finishes, and &lt;code&gt;Wait&lt;/code&gt; blocks until the count hits zero.&lt;/p&gt;</description></item><item><title>Hello, World</title><link>https://tutorialedge.net/courses/interactive-go/01-hello-world/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/01-hello-world/</guid><description>&lt;p&gt;Every great adventure begins with a single step. In Go, that step is a &lt;code&gt;main&lt;/code&gt; function inside the &lt;code&gt;main&lt;/code&gt; package — the entry point the Go runtime calls when your program starts.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Hello, World!&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;package main&lt;/code&gt; marks this as a runnable program, &lt;code&gt;import &amp;quot;fmt&amp;quot;&lt;/code&gt; pulls in Go&amp;rsquo;s formatting package, and &lt;code&gt;fmt.Println&lt;/code&gt; prints a line to the console.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Complete the &lt;code&gt;main&lt;/code&gt; function so the program prints exactly:&lt;/p&gt;</description></item><item><title>If / Else Conditionals</title><link>https://tutorialedge.net/courses/interactive-go/06-if-conditionals/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/06-if-conditionals/</guid><description>&lt;p&gt;Every adventurer must make decisions. In Go, &lt;code&gt;if&lt;/code&gt; runs a block only when its condition is true, and &lt;code&gt;else&lt;/code&gt; covers the other case:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; gold &lt;span style="color:#81a1c1"&gt;&amp;gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;100&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;You can afford the sword.&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Keep saving, adventurer.&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Conditions use comparison operators (&lt;code&gt;==&lt;/code&gt;, &lt;code&gt;!=&lt;/code&gt;, &lt;code&gt;&amp;lt;&lt;/code&gt;, &lt;code&gt;&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;=&lt;/code&gt;, &lt;code&gt;&amp;gt;=&lt;/code&gt;) and can be combined with &lt;code&gt;&amp;amp;&amp;amp;&lt;/code&gt; (and), &lt;code&gt;||&lt;/code&gt; (or), and &lt;code&gt;!&lt;/code&gt; (not). You can chain checks with &lt;code&gt;else if&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;The hero&amp;rsquo;s &lt;code&gt;health&lt;/code&gt; is &lt;code&gt;30&lt;/code&gt;. Print &lt;code&gt;Retreat!&lt;/code&gt; if &lt;code&gt;health&lt;/code&gt; is below &lt;code&gt;50&lt;/code&gt;, otherwise print &lt;code&gt;Charge!&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Interfaces</title><link>https://tutorialedge.net/courses/interactive-go/21-interfaces/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/21-interfaces/</guid><description>&lt;p&gt;An &lt;strong&gt;interface&lt;/strong&gt; describes &lt;em&gt;what a type can do&lt;/em&gt;, not what it is — a contract of method signatures:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Attacker &lt;span style="color:#81a1c1;font-weight:bold"&gt;interface&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#88c0d0"&gt;Attack&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Any type that has those methods satisfies the interface &lt;strong&gt;implicitly&lt;/strong&gt; — there&amp;rsquo;s no &lt;code&gt;implements&lt;/code&gt; keyword. If it has an &lt;code&gt;Attack() int&lt;/code&gt; method, it &lt;em&gt;is&lt;/em&gt; an &lt;code&gt;Attacker&lt;/code&gt;. This lets you write code against behaviour, so a &lt;code&gt;Goblin&lt;/code&gt;, a &lt;code&gt;Dragon&lt;/code&gt;, or a &lt;code&gt;Slime&lt;/code&gt; can all be passed wherever an &lt;code&gt;Attacker&lt;/code&gt; is expected.&lt;/p&gt;</description></item><item><title>Maps</title><link>https://tutorialedge.net/courses/interactive-go/11-maps/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/11-maps/</guid><description>&lt;p&gt;Sometimes a list isn&amp;rsquo;t enough — you want to look things up by name. A &lt;strong&gt;map&lt;/strong&gt; stores key/value pairs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prices &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;sword&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;100&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;shield&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;75&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;prices&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;bow&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;50&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// add or update&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;prices&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;sword&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;])&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// 100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Reading a missing key returns the value type&amp;rsquo;s zero value. To tell &amp;ldquo;missing&amp;rdquo; from &amp;ldquo;zero&amp;rdquo;, use the comma-ok idiom:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;qty&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; ok &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; prices&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;axe&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// qty=0, ok=false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Add &lt;code&gt;5&lt;/code&gt; &lt;code&gt;&amp;quot;arrows&amp;quot;&lt;/code&gt; to the &lt;code&gt;inventory&lt;/code&gt; map, then print the number of arrows.&lt;/p&gt;
&lt;p&gt;Expected output:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;5
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="hint"&gt;
 &lt;a href="#hint" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Hint&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;inventory[&amp;quot;arrows&amp;quot;] = 5&lt;/code&gt;, then &lt;code&gt;fmt.Println(inventory[&amp;quot;arrows&amp;quot;])&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Methods</title><link>https://tutorialedge.net/courses/interactive-go/18-methods/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/18-methods/</guid><description>&lt;p&gt;A &lt;strong&gt;method&lt;/strong&gt; is a function attached to a type via a &lt;em&gt;receiver&lt;/em&gt; in front of its name:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;m Monster&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Describe&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; m&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34; lurks nearby&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;goblin&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Describe&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The receiver can be a &lt;strong&gt;value&lt;/strong&gt; (&lt;code&gt;m Monster&lt;/code&gt;) or a &lt;strong&gt;pointer&lt;/strong&gt; (&lt;code&gt;m *Monster&lt;/code&gt;). Use a pointer receiver when the method needs to &lt;em&gt;modify&lt;/em&gt; the struct — a value receiver works on a copy, so changes wouldn&amp;rsquo;t stick.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;m &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Monster&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;TakeHit&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;dmg &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; m&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;HP &lt;span style="color:#81a1c1"&gt;-=&lt;/span&gt; dmg &lt;span style="color:#616e87;font-style:italic"&gt;// mutates the original&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Add a method &lt;code&gt;Heal&lt;/code&gt; with a pointer receiver (&lt;code&gt;*Hero&lt;/code&gt;) that adds &lt;code&gt;10&lt;/code&gt; to the hero&amp;rsquo;s &lt;code&gt;HP&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Pointers</title><link>https://tutorialedge.net/courses/interactive-go/19-pointers/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/19-pointers/</guid><description>&lt;p&gt;A &lt;strong&gt;pointer&lt;/strong&gt; holds the memory address of a value rather than a copy of it. Two operators do the work:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;amp;x&lt;/code&gt; takes the &lt;strong&gt;address&lt;/strong&gt; of &lt;code&gt;x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;*p&lt;/code&gt; &lt;strong&gt;dereferences&lt;/strong&gt; the pointer &lt;code&gt;p&lt;/code&gt; — reading or writing the value it points at.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hp &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;100&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;p &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;hp &lt;span style="color:#616e87;font-style:italic"&gt;// p points at hp&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;p &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;80&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// changes hp through the pointer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;hp&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// 80&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Pointers are how a function changes a caller&amp;rsquo;s variable instead of a copy — exactly what pointer receivers did in the last lesson.&lt;/p&gt;</description></item><item><title>Quest: Hero vs Monster</title><link>https://tutorialedge.net/courses/interactive-go/20-hero-vs-monster/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/20-hero-vs-monster/</guid><description>&lt;p&gt;The moment of combat is here. This quest brings together Module 5: a &lt;strong&gt;struct&lt;/strong&gt; for the combatant, a &lt;strong&gt;method&lt;/strong&gt; with a &lt;strong&gt;pointer receiver&lt;/strong&gt; to change its state, and repeated calls to whittle the monster down.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Call &lt;code&gt;TakeDamage(12)&lt;/code&gt; on the &lt;code&gt;monster&lt;/code&gt; twice, then print its remaining &lt;code&gt;HP&lt;/code&gt;. Starting at 30, two 12-damage hits leave:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;6
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="hint"&gt;
 &lt;a href="#hint" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Hint&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;monster.TakeDamage(12)&lt;/code&gt; twice (Go automatically takes the monster&amp;rsquo;s address for the pointer receiver), then &lt;code&gt;fmt.Println(monster.HP)&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Quest: The Character Sheet</title><link>https://tutorialedge.net/courses/interactive-go/05-character-sheet/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/05-character-sheet/</guid><description>&lt;p&gt;Time to put your training to the test, adventurer. You&amp;rsquo;ve learned short variables, long-hand &lt;code&gt;var&lt;/code&gt; declarations with explicit types, and constants. This quest combines all three.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;fmt.Printf&lt;/code&gt; lets you build a formatted string using verbs: &lt;code&gt;%s&lt;/code&gt; for strings and &lt;code&gt;%d&lt;/code&gt; for integers. End with &lt;code&gt;\n&lt;/code&gt; for a newline.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;%s dealt %d damage\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; attacker&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; damage&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Using the &lt;code&gt;name&lt;/code&gt;, &lt;code&gt;class&lt;/code&gt;, &lt;code&gt;level&lt;/code&gt;, and &lt;code&gt;startingGold&lt;/code&gt; values already defined, print a single line that reads exactly:&lt;/p&gt;</description></item><item><title>Quest: The Dungeon Crawl</title><link>https://tutorialedge.net/courses/interactive-go/09-dungeon-crawl/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/09-dungeon-crawl/</guid><description>&lt;p&gt;Time to descend into the dungeon, adventurer. You&amp;rsquo;ll need loops and conditionals working together — a &lt;code&gt;for&lt;/code&gt; loop to visit each room, and an &lt;code&gt;if&lt;/code&gt; inside to decide what awaits.&lt;/p&gt;
&lt;p&gt;The remainder operator &lt;code&gt;%&lt;/code&gt; is handy here: &lt;code&gt;n % 2 == 0&lt;/code&gt; is true when &lt;code&gt;n&lt;/code&gt; is even.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; step&lt;span style="color:#81a1c1"&gt;%&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;even step&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Loop from room &lt;code&gt;1&lt;/code&gt; to &lt;code&gt;rooms&lt;/code&gt; (5). For each room, print &lt;code&gt;Room N: trap!&lt;/code&gt; if the room number is even, otherwise &lt;code&gt;Room N: safe.&lt;/code&gt; (using the real number in place of &lt;code&gt;N&lt;/code&gt;).&lt;/p&gt;</description></item><item><title>Quest: The Inventory</title><link>https://tutorialedge.net/courses/interactive-go/12-the-inventory/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/12-the-inventory/</guid><description>&lt;p&gt;You&amp;rsquo;ve returned from the dungeon with a pile of &lt;code&gt;loot&lt;/code&gt;. Time to tally it up — a classic job for a slice (the loot) and a map (the running counts).&lt;/p&gt;
&lt;p&gt;Ranging over a slice gives you each item; incrementing a map key counts them:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; item &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; loot &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; counts&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;item&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Incrementing a missing key just starts it from its zero value (&lt;code&gt;0&lt;/code&gt;), so you don&amp;rsquo;t need to initialise each entry.&lt;/p&gt;</description></item><item><title>Quest: The Locked Chest</title><link>https://tutorialedge.net/courses/interactive-go/23-the-locked-chest/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/23-the-locked-chest/</guid><description>&lt;p&gt;A locked chest sits before you. This quest brings together Module 6: an &lt;strong&gt;interface&lt;/strong&gt; (&lt;code&gt;Lock&lt;/code&gt;) implemented by a type (&lt;code&gt;Chest&lt;/code&gt;), and the &lt;strong&gt;error&lt;/strong&gt; it returns when the wrong key is used.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Call &lt;code&gt;l.Open(&amp;quot;silver&amp;quot;)&lt;/code&gt;. If it returns an error, print it; otherwise print &lt;code&gt;The chest opens!&lt;/code&gt;. Since the chest only opens for &lt;code&gt;&amp;quot;gold&amp;quot;&lt;/code&gt;, you should see:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;the chest stays shut
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="hint"&gt;
 &lt;a href="#hint" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Hint&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;err := l.Open(&amp;quot;silver&amp;quot;)&lt;/code&gt;, then &lt;code&gt;if err != nil { fmt.Println(err) } else { fmt.Println(&amp;quot;The chest opens!&amp;quot;) }&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Quest: The Spell Loop</title><link>https://tutorialedge.net/courses/interactive-go/16-the-spell-loop/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/16-the-spell-loop/</guid><description>&lt;p&gt;A barrage of blows is incoming, adventurer. This quest brings together the tools of Module 4: a &lt;strong&gt;variadic&lt;/strong&gt; parameter for the unknown number of hits, a loop to apply them, and &lt;strong&gt;multiple return values&lt;/strong&gt; to report the outcome.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Complete &lt;code&gt;applyDamage&lt;/code&gt;: subtract every value in &lt;code&gt;hits&lt;/code&gt; from &lt;code&gt;health&lt;/code&gt;, then return the remaining &lt;code&gt;health&lt;/code&gt; and a boolean for whether it&amp;rsquo;s still above &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;applyDamage(100, 30, 40, 20)&lt;/code&gt; the hits total 90, so:&lt;/p&gt;</description></item><item><title>Quest: The War Party</title><link>https://tutorialedge.net/courses/interactive-go/27-the-war-party/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/27-the-war-party/</guid><description>&lt;p&gt;The war party charges, each member striking at once. This final concurrency quest brings it all together: a &lt;strong&gt;goroutine&lt;/strong&gt; per attacker, a &lt;strong&gt;channel&lt;/strong&gt; to collect their damage, and a &lt;strong&gt;WaitGroup&lt;/strong&gt; to know when every blow has landed before we tally up.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Inside the loop, launch a goroutine for each &lt;code&gt;d&lt;/code&gt; that sends &lt;code&gt;d&lt;/code&gt; into the &lt;code&gt;results&lt;/code&gt; channel and then calls &lt;code&gt;wg.Done()&lt;/code&gt;. Pass &lt;code&gt;d&lt;/code&gt; in as an argument so each goroutine gets its own value.&lt;/p&gt;</description></item><item><title>Select &amp; sync</title><link>https://tutorialedge.net/courses/interactive-go/26-select-and-sync/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/26-select-and-sync/</guid><description>&lt;p&gt;When you&amp;rsquo;re juggling several channels, &lt;code&gt;select&lt;/code&gt; waits on all of them at once and runs whichever is ready first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;select&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;case&lt;/span&gt; msg &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt;orders&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;order:&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; msg&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt;quit&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;standing down&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;sync&lt;/code&gt; package covers the cases where channels are overkill — &lt;code&gt;sync.WaitGroup&lt;/code&gt; (which you&amp;rsquo;ve met) for waiting, and &lt;code&gt;sync.Mutex&lt;/code&gt; (&lt;code&gt;Lock&lt;/code&gt;/&lt;code&gt;Unlock&lt;/code&gt;) to protect shared state from concurrent writes.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Use a &lt;code&gt;select&lt;/code&gt; statement to receive a value from the &lt;code&gt;ready&lt;/code&gt; channel and print it. (It&amp;rsquo;s a buffered channel that already holds &lt;code&gt;&amp;quot;go!&amp;quot;&lt;/code&gt;, so the receive is ready immediately.)&lt;/p&gt;</description></item><item><title>Structs</title><link>https://tutorialedge.net/courses/interactive-go/17-structs/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/17-structs/</guid><description>&lt;p&gt;So far our heroes have been scattered across separate variables. A &lt;strong&gt;struct&lt;/strong&gt; lets you bundle related fields into a single custom type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Monster &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; HP &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You create a value with a struct literal and reach fields with a dot:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;goblin &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; Monster&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Goblin&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; HP&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;30&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;goblin&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// Goblin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;goblin&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;HP &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;25&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// fields are mutable&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Create a &lt;code&gt;Hero&lt;/code&gt; value named &lt;code&gt;&amp;quot;Elara&amp;quot;&lt;/code&gt; at level &lt;code&gt;5&lt;/code&gt;, then print its &lt;code&gt;Name&lt;/code&gt; and &lt;code&gt;Level&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Switch Statements</title><link>https://tutorialedge.net/courses/interactive-go/07-switch-cases/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/07-switch-cases/</guid><description>&lt;p&gt;When you have one value and many possible branches, a chain of &lt;code&gt;else if&lt;/code&gt; gets noisy. Go&amp;rsquo;s &lt;code&gt;switch&lt;/code&gt; is cleaner:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;switch&lt;/span&gt; weather &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;sunny&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;A fine day to adventure.&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;stormy&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Best stay at the inn.&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;default&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Weather unknown.&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Unlike many languages, Go does &lt;strong&gt;not&lt;/strong&gt; fall through to the next case automatically — each case stops on its own, so you rarely need &lt;code&gt;break&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Switch on &lt;code&gt;class&lt;/code&gt;: print &lt;code&gt;Casts a fireball!&lt;/code&gt; for &lt;code&gt;&amp;quot;Mage&amp;quot;&lt;/code&gt;, &lt;code&gt;Swings a sword!&lt;/code&gt; for &lt;code&gt;&amp;quot;Warrior&amp;quot;&lt;/code&gt;, and &lt;code&gt;Waits.&lt;/code&gt; for anything else.&lt;/p&gt;</description></item><item><title>Types &amp; Long-hand Variables</title><link>https://tutorialedge.net/courses/interactive-go/03-long-hand-variables/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/03-long-hand-variables/</guid><description>&lt;p&gt;The &lt;code&gt;:=&lt;/code&gt; operator is handy, but sometimes you want to be explicit about a variable&amp;rsquo;s type. The long-hand form uses the &lt;code&gt;var&lt;/code&gt; keyword followed by a name and a type:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; heroName &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Aragorn&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; level &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; alive &lt;span style="color:#81a1c1"&gt;bool&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; damage &lt;span style="color:#81a1c1"&gt;float64&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;12.5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Go&amp;rsquo;s basic types include &lt;code&gt;string&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt;, &lt;code&gt;bool&lt;/code&gt;, and &lt;code&gt;float64&lt;/code&gt;. If you declare a variable without a value, it takes that type&amp;rsquo;s &lt;strong&gt;zero value&lt;/strong&gt; (&lt;code&gt;0&lt;/code&gt;, &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt;, or &lt;code&gt;false&lt;/code&gt;).&lt;/p&gt;
&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;Declare a &lt;code&gt;bool&lt;/code&gt; variable named &lt;code&gt;isReady&lt;/code&gt; set to &lt;code&gt;true&lt;/code&gt; using the long-hand &lt;code&gt;var&lt;/code&gt; form.&lt;/p&gt;</description></item><item><title>Variables</title><link>https://tutorialedge.net/courses/interactive-go/02-variables/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/02-variables/</guid><description>&lt;p&gt;Adventurers need somewhere to keep their gold, health, and gear. In Go, that somewhere is a &lt;strong&gt;variable&lt;/strong&gt;. The quickest way to make one is the short declaration operator &lt;code&gt;:=&lt;/code&gt;, which both declares the variable and infers its type from the value.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;gold &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;100&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// an int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;name &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Elara&amp;#34;&lt;/span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// a string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="your-quest"&gt;
 &lt;a href="#your-quest" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Your Quest&lt;/h2&gt;
&lt;p&gt;The program already declares &lt;code&gt;baseHealth&lt;/code&gt;. Declare a second variable &lt;code&gt;bonusHealth&lt;/code&gt; set to &lt;code&gt;50&lt;/code&gt; so the program prints the total.&lt;/p&gt;
&lt;p&gt;Expected output:&lt;/p&gt;</description></item><item><title>Variadic Functions &amp; Closures</title><link>https://tutorialedge.net/courses/interactive-go/14-variadic-closures/</link><pubDate>Sat, 06 Jun 2026 11:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-go/14-variadic-closures/</guid><description>&lt;p&gt;Sometimes you don&amp;rsquo;t know how many arguments you&amp;rsquo;ll get — a party might have one hero or six. A &lt;strong&gt;variadic&lt;/strong&gt; function accepts any number of them using &lt;code&gt;...&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;shout&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;words &lt;span style="color:#81a1c1"&gt;...&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; w &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; words &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#88c0d0"&gt;shout&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;for&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;the&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;realm&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Inside the function, the variadic parameter is just a slice.&lt;/p&gt;
&lt;p&gt;Functions are also values in Go, and a &lt;strong&gt;closure&lt;/strong&gt; is a function that captures variables from around it — handy for counters and generators:&lt;/p&gt;</description></item><item><title>Structured Logging in Go with log/slog - The Complete Guide</title><link>https://tutorialedge.net/golang/go-slog-structured-logging-tutorial/</link><pubDate>Wed, 03 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/go-slog-structured-logging-tutorial/</guid><description>&lt;p&gt;In this tutorial we are going to take a thorough look at &lt;code&gt;log/slog&lt;/code&gt; — the structured logging package that landed in the standard library in Go 1.21. By the end you&amp;rsquo;ll know how to configure handlers, set log levels, attach structured attributes, carry loggers through &lt;code&gt;context.Context&lt;/code&gt;, write your own handlers, and redact sensitive fields.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll also make the case for &lt;em&gt;why&lt;/em&gt; &lt;code&gt;slog&lt;/code&gt; has become the default choice for new Go projects, and why it makes third-party loggers like &lt;code&gt;logrus&lt;/code&gt;, &lt;code&gt;zap&lt;/code&gt; and &lt;code&gt;zerolog&lt;/code&gt; hard to justify reaching for anymore.&lt;/p&gt;</description></item><item><title>An Introduction to Go Closures - Tutorial</title><link>https://tutorialedge.net/golang/go-closures-tutorial/</link><pubDate>Tue, 02 Jun 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/go-closures-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to look at closures in Go. We&amp;rsquo;ll cover the theory
behind them, then see how you can use them in your own Go applications.&lt;/p&gt;
&lt;h2 id="closures---the-theory"&gt;
 &lt;a href="#closures---the-theory" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Closures - The Theory&lt;/h2&gt;
&lt;p&gt;So, let&amp;rsquo;s dive into the theory.&lt;/p&gt;
&lt;p&gt;We can create and use closures in any programming language that supports
functions as first-class objects. Go happens to be one such language, otherwise
this article would be pointless.&lt;/p&gt;</description></item><item><title>Makefiles for Go Developers</title><link>https://tutorialedge.net/golang/makefiles-for-go-developers/</link><pubDate>Fri, 29 May 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/makefiles-for-go-developers/</guid><description>&lt;p&gt;In this tutorial we are going to look at how you can use Makefiles to automate the most common tasks in a Go project — building, running, and cross-compiling your application — all from a single &lt;code&gt;make&lt;/code&gt; command. By the end you&amp;rsquo;ll have a working &lt;code&gt;Makefile&lt;/code&gt; you can drop into any Go project and extend from there.&lt;/p&gt;
&lt;h2 id="what-are-makefiles"&gt;
 &lt;a href="#what-are-makefiles" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What are Makefiles?&lt;/h2&gt;
&lt;p&gt;Makefiles are an automation tool built around the &lt;code&gt;make&lt;/code&gt; command-line utility. You define named &lt;em&gt;targets&lt;/em&gt;, each containing a shell script to run, and then invoke them with &lt;code&gt;make &amp;lt;target&amp;gt;&lt;/code&gt;. They&amp;rsquo;re not Go-specific — you&amp;rsquo;ll find them in C, Python, and Rust projects too — but they&amp;rsquo;re particularly common in the Go ecosystem because Go projects often need a short sequence of commands (format, vet, build, test) chained together before a binary is ready.&lt;/p&gt;</description></item><item><title>Getting Started with the Claude API in Go</title><link>https://tutorialedge.net/ai/getting-started-with-claude-api-in-go/</link><pubDate>Wed, 27 May 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/getting-started-with-claude-api-in-go/</guid><description>&lt;p&gt;In this tutorial, we&amp;rsquo;re going to walk through how to use Anthropic&amp;rsquo;s Claude API in Go using the official SDK — no Python, no boilerplate frameworks. You&amp;rsquo;ll learn how to set up the client, send your first message to Claude, and build a proper multi-turn conversation that maintains context across exchanges. These two patterns are the foundation for any AI-powered Go tool you want to build.&lt;/p&gt;
&lt;p&gt;If you prefer video, I&amp;rsquo;ve covered this exact material on YouTube:&lt;/p&gt;</description></item><item><title>Checking if a File or Directory Exists in Go</title><link>https://tutorialedge.net/golang/snippets/check-file-exists-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/check-file-exists-go/</guid><description>&lt;p&gt;Checking whether a file or directory exists is a common operation in Go programs. The &lt;code&gt;os.Stat&lt;/code&gt; function returns file information, and by checking the error returned, you can determine if the path exists. The &lt;code&gt;os.IsNotExist&lt;/code&gt; helper function makes this check clear and idiomatic.&lt;/p&gt;
&lt;p&gt;When &lt;code&gt;os.Stat&lt;/code&gt; is called on a non-existent path, it returns a non-nil error. Using &lt;code&gt;os.IsNotExist(err)&lt;/code&gt; checks specifically for the &amp;ldquo;file not found&amp;rdquo; error condition, distinguishing it from other errors like permission denied. This is more reliable than checking error messages with string comparisons.&lt;/p&gt;</description></item><item><title>Checking if a Slice Contains an Element in Go</title><link>https://tutorialedge.net/golang/snippets/check-slice-contains-element-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/check-slice-contains-element-go/</guid><description>&lt;p&gt;Checking whether a slice contains a specific element is a common operation in Go. This snippet demonstrates a straightforward approach using a loop-based search function.&lt;/p&gt;
&lt;p&gt;The function iterates through each element in the slice and compares it with the target value. As soon as a match is found, the function returns &lt;code&gt;true&lt;/code&gt;. If the loop completes without finding a match, the function returns &lt;code&gt;false&lt;/code&gt;. This approach is simple, readable, and works with any comparable type.&lt;/p&gt;</description></item><item><title>Counting Occurrences Using a Map in Go</title><link>https://tutorialedge.net/golang/snippets/counting-occurrences-with-map-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/counting-occurrences-with-map-go/</guid><description>&lt;p&gt;Counting occurrences of items is a fundamental pattern in data processing and analysis. Using a map as a frequency counter is the Go way to solve this problem. By iterating through a collection and incrementing the count for each item, you can quickly build a frequency table with minimal code.&lt;/p&gt;
&lt;p&gt;This approach works for any comparable type as a key, making it versatile for counting strings, integers, or other hashable values. The pattern is efficient with O(n) time complexity and is commonly used in word frequency analysis, character counting, and statistical processing tasks.&lt;/p&gt;</description></item><item><title>Creating HTTP Middleware in Go</title><link>https://tutorialedge.net/golang/snippets/http-middleware-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/http-middleware-in-go/</guid><description>&lt;p&gt;Middleware in Go is implemented by wrapping handler functions or multiplexers. A middleware function takes an &lt;code&gt;http.Handler&lt;/code&gt; and returns a new &lt;code&gt;http.Handler&lt;/code&gt; that can perform actions before and after calling the original handler. This pattern allows you to compose behaviors like logging, authentication, and error handling.&lt;/p&gt;
&lt;p&gt;The example shows a logging middleware that prints request information before passing control to the next handler. You can chain multiple middleware by nesting calls, creating a clean and composable architecture. Each middleware layer has the opportunity to modify the request, observe the response, or even short-circuit the chain.&lt;/p&gt;</description></item><item><title>Custom JSON Marshaling and Unmarshaling in Go</title><link>https://tutorialedge.net/golang/snippets/custom-json-marshaling-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/custom-json-marshaling-go/</guid><description>&lt;p&gt;Custom marshaling allows you to control how your types are converted to and from JSON. By implementing the &lt;code&gt;MarshalJSON&lt;/code&gt; method on a type, you can customize the JSON representation. This is particularly useful for types like &lt;code&gt;time.Time&lt;/code&gt; that have a natural JSON representation different from their Go structure.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;MarshalJSON&lt;/code&gt; method receives a receiver and returns a JSON-encoded byte slice and an error. Inside the method, you have complete control over what gets marshalled. A common pattern is to create an alias type to avoid infinite recursion, embed it in a temporary struct with custom fields, and marshal that temporary struct.&lt;/p&gt;</description></item><item><title>Deep Copying Structs in Go</title><link>https://tutorialedge.net/golang/snippets/deep-copy-structs-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/deep-copy-structs-in-go/</guid><description>&lt;p&gt;Deep copying is important when you need to ensure that modifications to a copied struct do not affect the original. Unlike simple assignment, which creates a shallow copy, a deep copy recursively duplicates all nested structures and pointers. The manual approach shown here involves explicitly copying each field, ensuring nested structs and slices are also duplicated.&lt;/p&gt;
&lt;p&gt;For more complex scenarios, alternative approaches include using the &lt;code&gt;encoding/gob&lt;/code&gt; package or JSON marshaling and unmarshaling to create deep copies. However, the manual method is transparent, performant, and gives you full control over what gets copied. Choose the approach that best fits your use case and performance requirements.&lt;/p&gt;</description></item><item><title>Difference Between make() and new() in Go</title><link>https://tutorialedge.net/golang/snippets/make-vs-new-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/make-vs-new-in-go/</guid><description>&lt;p&gt;Go provides two different built-in functions for memory allocation: &lt;code&gt;make()&lt;/code&gt; and &lt;code&gt;new()&lt;/code&gt;. Understanding when to use each is essential for writing idiomatic Go code. The &lt;code&gt;make()&lt;/code&gt; function is used exclusively for slices, maps, and channels. It allocates memory, initializes the internal data structure, and returns a ready-to-use value, not a pointer.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;new()&lt;/code&gt; function, by contrast, allocates memory for a type, initializes it to its zero value, and returns a pointer to it. It works with any type but is most commonly used for creating pointers to structs. Use &lt;code&gt;make()&lt;/code&gt; for slices, maps, and channels; use &lt;code&gt;new()&lt;/code&gt; for pointers to zero-initialized values when you specifically need a pointer rather than an initialized collection.&lt;/p&gt;</description></item><item><title>Extracting a Substring in Go</title><link>https://tutorialedge.net/golang/snippets/extracting-substrings-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/extracting-substrings-in-go/</guid><description>&lt;p&gt;In Go, you can extract substrings using slice notation with the syntax &lt;code&gt;string[start:end]&lt;/code&gt;, where start is inclusive and end is exclusive. This approach works directly on strings and is very efficient for ASCII text. However, when working with Unicode characters, byte-based slicing can produce incorrect results because multi-byte characters may be split in the middle.&lt;/p&gt;
&lt;p&gt;For Unicode-safe substring extraction, convert the string to a rune slice first, perform the slicing operation, and then convert back to a string. This ensures that each character, regardless of its byte length, is treated as a single unit. The standard slice notation returns a new string without modifying the original, since strings in Go are immutable.&lt;/p&gt;</description></item><item><title>Fan-Out Fan-In Concurrency Pattern in Go</title><link>https://tutorialedge.net/golang/snippets/fan-out-fan-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/fan-out-fan-in-go/</guid><description>&lt;p&gt;The fan-out fan-in pattern is a Go concurrency technique where you distribute work across multiple goroutines (fan-out) and then collect their results back into a single channel (fan-in). This pattern is useful when you have independent work items that can be processed in parallel.&lt;/p&gt;
&lt;p&gt;Fan-out refers to starting multiple goroutines to handle slices of work, each writing results to a shared channel. Fan-in refers to the central collection point that reads from that channel until all results are received. This pattern naturally expresses the idea of parallel processing and result aggregation.&lt;/p&gt;</description></item><item><title>Filtering Slice Elements in Go</title><link>https://tutorialedge.net/golang/snippets/filter-slice-elements-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/filter-slice-elements-go/</guid><description>&lt;p&gt;Filtering a slice to extract only elements that meet certain criteria is a fundamental operation in Go. This snippet shows how to create a new slice containing only the elements that pass a given condition.&lt;/p&gt;
&lt;p&gt;The approach iterates through each element in the original slice and evaluates it against the filtering condition. When an element matches the condition, it&amp;rsquo;s appended to a new slice. This creates a filtered result while leaving the original slice unchanged.&lt;/p&gt;</description></item><item><title>Finding the Index of an Element in a Slice in Go</title><link>https://tutorialedge.net/golang/snippets/find-index-of-element-in-slice-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/find-index-of-element-in-slice-go/</guid><description>&lt;p&gt;Finding the index of an element in a slice is a common task in Go programming. This snippet demonstrates how to locate an element and retrieve its position.&lt;/p&gt;
&lt;p&gt;The traditional approach uses a simple loop to iterate through the slice and compare each element with the target value. When a match is found, we store the index and break out of the loop. If no match is found, the index remains -1.&lt;/p&gt;</description></item><item><title>Getting File Size and Modification Time in Go</title><link>https://tutorialedge.net/golang/snippets/get-file-info-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/get-file-info-go/</guid><description>&lt;p&gt;The &lt;code&gt;os.Stat&lt;/code&gt; function returns a &lt;code&gt;FileInfo&lt;/code&gt; interface that provides comprehensive metadata about a file or directory. This includes the file size, modification time, permission bits, and whether the path is a directory. Accessing this information is efficient since &lt;code&gt;os.Stat&lt;/code&gt; makes a single system call.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;Size()&lt;/code&gt; method returns the file size in bytes, while &lt;code&gt;ModTime()&lt;/code&gt; returns a &lt;code&gt;time.Time&lt;/code&gt; value representing the last modification timestamp. You can use &lt;code&gt;IsDir()&lt;/code&gt; to determine if the path is a directory rather than a regular file. The &lt;code&gt;Mode()&lt;/code&gt; method provides the file&amp;rsquo;s permission bits and other mode information.&lt;/p&gt;</description></item><item><title>Handling HTTP Query Parameters in Go</title><link>https://tutorialedge.net/golang/snippets/http-query-parameters-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/http-query-parameters-go/</guid><description>&lt;p&gt;Query parameters are a fundamental part of HTTP requests and Go makes it easy to extract and work with them. The &lt;code&gt;r.URL.Query()&lt;/code&gt; method returns a &lt;code&gt;url.Values&lt;/code&gt; map where you can retrieve parameter values by key. The &lt;code&gt;Get&lt;/code&gt; method returns the first value for a given key, or an empty string if the key doesn&amp;rsquo;t exist.&lt;/p&gt;
&lt;p&gt;For more advanced use cases, &lt;code&gt;url.Values&lt;/code&gt; provides methods like &lt;code&gt;Getall&lt;/code&gt; to retrieve all values for a parameter that might appear multiple times, and &lt;code&gt;Has&lt;/code&gt; to check if a parameter exists. This is useful for filtering, pagination, and search functionality in web applications.&lt;/p&gt;</description></item><item><title>Iterating Over a Map in Sorted Order in Go</title><link>https://tutorialedge.net/golang/snippets/iterating-map-sorted-order-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/iterating-map-sorted-order-go/</guid><description>&lt;p&gt;Maps in Go are unordered collections, meaning iteration order is random and non-deterministic. When you need to iterate over a map in a predictable order, the standard approach is to extract the keys into a slice, sort that slice, and then iterate over the sorted keys to access the map values.&lt;/p&gt;
&lt;p&gt;This pattern is especially useful when you need consistent output for testing, logging, or any scenario where the order matters. The &lt;code&gt;sort&lt;/code&gt; package provides convenient functions like &lt;code&gt;sort.Strings()&lt;/code&gt;, &lt;code&gt;sort.Ints()&lt;/code&gt;, and &lt;code&gt;sort.Sort()&lt;/code&gt; for custom types.&lt;/p&gt;</description></item><item><title>Listing Files in a Directory in Go</title><link>https://tutorialedge.net/golang/snippets/listing-files-in-directory-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/listing-files-in-directory-go/</guid><description>&lt;p&gt;The &lt;code&gt;os.ReadDir&lt;/code&gt; function provides an efficient way to list the contents of a directory in Go. Introduced in Go 1.16, it returns a slice of &lt;code&gt;DirEntry&lt;/code&gt; objects that are sorted by filename, making it easier to work with directory listings than the older &lt;code&gt;ioutil.ReadDir&lt;/code&gt; approach.&lt;/p&gt;
&lt;p&gt;Each &lt;code&gt;DirEntry&lt;/code&gt; provides methods like &lt;code&gt;Name()&lt;/code&gt; to get the filename, &lt;code&gt;IsDir()&lt;/code&gt; to check if it&amp;rsquo;s a directory, and &lt;code&gt;Info()&lt;/code&gt; to get detailed file information including size and modification time. This design allows you to avoid unnecessary system calls when you only need basic information.&lt;/p&gt;</description></item><item><title>Making HTTP Requests with Custom Headers in Go</title><link>https://tutorialedge.net/golang/snippets/http-request-with-headers-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/http-request-with-headers-go/</guid><description>&lt;p&gt;When working with APIs, you often need to send custom headers for authentication, content negotiation, or other purposes. Go&amp;rsquo;s &lt;code&gt;http.NewRequest&lt;/code&gt; function allows you to create a request object that you can customize before sending it. After creating the request, use the &lt;code&gt;Header&lt;/code&gt; field to add custom headers with the &lt;code&gt;Set&lt;/code&gt; method.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;http.Client&lt;/code&gt; type gives you control over request timeouts, redirects, and other options. By specifying a timeout, you ensure that requests don&amp;rsquo;t hang indefinitely. The &lt;code&gt;Do&lt;/code&gt; method executes the request and returns the response, which contains the status code and response body.&lt;/p&gt;</description></item><item><title>Mapping Over Slice Elements in Go</title><link>https://tutorialedge.net/golang/snippets/map-over-slice-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/map-over-slice-go/</guid><description>&lt;p&gt;Mapping over slice elements allows you to transform each element in a slice and collect the results into a new slice. This is a common functional programming pattern that works well in Go.&lt;/p&gt;
&lt;p&gt;In this example, we create a new slice with the same capacity as the original and iterate through each element, applying a transformation (doubling each number) and storing the result at the corresponding index in the new slice. Pre-allocating the slice with &lt;code&gt;make()&lt;/code&gt; is more efficient than appending repeatedly.&lt;/p&gt;</description></item><item><title>Merging Two Maps in Go</title><link>https://tutorialedge.net/golang/snippets/merging-maps-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/merging-maps-in-go/</guid><description>&lt;p&gt;Merging maps is a common operation when working with configuration data, combining results from multiple sources, or aggregating information. The simplest approach is to iterate over each map and copy key-value pairs into a new destination map. If a key exists in both maps, the second map&amp;rsquo;s value will overwrite the first.&lt;/p&gt;
&lt;p&gt;Starting with Go 1.21, the &lt;code&gt;maps&lt;/code&gt; package includes a &lt;code&gt;Copy()&lt;/code&gt; function that provides a cleaner way to copy one map into another. For basic merging needs, the loop approach is straightforward and has been available since the beginning of Go.&lt;/p&gt;</description></item><item><title>Nil Checking and Interface Nil Gotcha in Go</title><link>https://tutorialedge.net/golang/snippets/nil-checking-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/nil-checking-in-go/</guid><description>&lt;p&gt;Nil checking in Go is straightforward for pointers and simple types, but interfaces introduce a subtle gotcha. An interface value is only nil when both its type and value are nil. If you assign a nil &lt;code&gt;*MyError&lt;/code&gt; pointer to an &lt;code&gt;error&lt;/code&gt; interface variable, the interface itself is not nil because it now holds a type (&lt;code&gt;*MyError&lt;/code&gt;) even though the underlying value is nil.&lt;/p&gt;
&lt;p&gt;This gotcha catches many Go developers. In our example, &lt;code&gt;myErr&lt;/code&gt; is a nil pointer of type &lt;code&gt;*MyError&lt;/code&gt;. When we assign it to &lt;code&gt;err&lt;/code&gt; (an &lt;code&gt;error&lt;/code&gt; interface), the interface stores the type information alongside the nil value. The comparison &lt;code&gt;err == nil&lt;/code&gt; returns &lt;code&gt;false&lt;/code&gt; because the interface has a concrete type. Always be aware of this distinction when returning errors from functions to avoid unexpected behaviour.&lt;/p&gt;</description></item><item><title>Pointer Receivers vs Value Receivers in Go</title><link>https://tutorialedge.net/golang/snippets/pointer-vs-value-receivers-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/pointer-vs-value-receivers-go/</guid><description>&lt;p&gt;Go allows you to define methods on both pointer and value receivers. A value receiver operates on a copy of the struct, so any modifications are lost after the method returns. A pointer receiver operates on the original struct, allowing you to modify its fields and have those changes persist.&lt;/p&gt;
&lt;p&gt;Use value receivers when your method doesn&amp;rsquo;t need to modify the struct and the struct is small enough that copying is efficient. Use pointer receivers when your method needs to modify the struct, when the struct is large, or when consistency demands that all methods on a type use the same receiver type. Following these guidelines ensures your code is predictable and efficient.&lt;/p&gt;</description></item><item><title>Reading and Writing Files in Go</title><link>https://tutorialedge.net/golang/snippets/reading-and-writing-files-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/reading-and-writing-files-go/</guid><description>&lt;p&gt;Go provides simple and efficient ways to read and write files using the &lt;code&gt;os&lt;/code&gt; package. The &lt;code&gt;os.ReadFile&lt;/code&gt; and &lt;code&gt;os.WriteFile&lt;/code&gt; functions, introduced in Go 1.16, offer a convenient interface for basic file operations without needing to manage file handles manually.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;os.WriteFile&lt;/code&gt; function takes a filename, byte slice, and file permission bits, making it easy to write data to a file in a single operation. Similarly, &lt;code&gt;os.ReadFile&lt;/code&gt; reads an entire file into memory as a byte slice, which is perfect for small to medium-sized files. Both functions handle file opening and closing automatically.&lt;/p&gt;</description></item><item><title>Regular Expression Matching in Go</title><link>https://tutorialedge.net/golang/snippets/regex-matching-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/regex-matching-in-go/</guid><description>&lt;p&gt;Regular expressions in Go are handled by the &lt;code&gt;regexp&lt;/code&gt; package, which provides powerful pattern matching capabilities. The &lt;code&gt;MatchString&lt;/code&gt; function is the simplest way to check if a pattern exists in a string, returning a boolean. For more complex operations, &lt;code&gt;MustCompile&lt;/code&gt; creates a compiled regular expression object that can be reused efficiently.&lt;/p&gt;
&lt;p&gt;Once you have a compiled regex, you can use methods like &lt;code&gt;FindString&lt;/code&gt; to find the first match, or &lt;code&gt;FindAllString&lt;/code&gt; to find all matches. The &lt;code&gt;-1&lt;/code&gt; parameter in &lt;code&gt;FindAllString&lt;/code&gt; means find all occurrences rather than limiting the results. This compiled approach is significantly faster when you need to match against multiple strings.&lt;/p&gt;</description></item><item><title>Removing an Element from a Slice in Go</title><link>https://tutorialedge.net/golang/snippets/remove-element-from-slice-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/remove-element-from-slice-go/</guid><description>&lt;p&gt;Removing an element from a slice in Go requires creating a new slice that excludes the element at the specified index. The most efficient way to do this is using the append pattern with slice operations.&lt;/p&gt;
&lt;p&gt;The key technique is to use &lt;code&gt;append()&lt;/code&gt; with two slice segments: the first part of the slice up to (but not including) the element to remove, and the second part starting from the element after the one to remove. The three dots (&lt;code&gt;...&lt;/code&gt;) unpacks the second slice as individual arguments to append.&lt;/p&gt;</description></item><item><title>Replacing All Occurrences in a String in Go</title><link>https://tutorialedge.net/golang/snippets/replacing-strings-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/replacing-strings-in-go/</guid><description>&lt;p&gt;The &lt;code&gt;strings.ReplaceAll&lt;/code&gt; function replaces all occurrences of a substring with a replacement string, returning a new string without modifying the original. This is the most straightforward approach when you want to replace every instance of a particular substring. Go strings are immutable, so all replacement operations return new string values.&lt;/p&gt;
&lt;p&gt;For more granular control, &lt;code&gt;strings.Replace&lt;/code&gt; allows you to specify a maximum number of replacements to perform. By passing -1 as the count parameter, &lt;code&gt;Replace&lt;/code&gt; behaves identically to &lt;code&gt;ReplaceAll&lt;/code&gt;. This function is useful when you want to replace only the first few occurrences or when the count is dynamic.&lt;/p&gt;</description></item><item><title>Reversing a Slice in Go</title><link>https://tutorialedge.net/golang/snippets/reverse-slice-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/reverse-slice-in-go/</guid><description>&lt;p&gt;Reversing a slice in Go can be accomplished with an efficient in-place algorithm that swaps elements from both ends of the slice moving toward the center. This approach modifies the original slice and uses constant extra space.&lt;/p&gt;
&lt;p&gt;The manual swap approach uses two pointers: one starting at the beginning of the slice and one at the end. In each iteration, the elements at both pointers are swapped, then the pointers move toward the center. When the pointers meet or cross, the reversal is complete.&lt;/p&gt;</description></item><item><title>Reversing a String in Go</title><link>https://tutorialedge.net/golang/snippets/reversing-a-string-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/reversing-a-string-in-go/</guid><description>&lt;p&gt;Reversing strings in Go requires careful consideration of Unicode characters. While a simple byte-by-byte reversal might work for ASCII text, it will corrupt multi-byte Unicode characters like accented letters or emoji. The correct approach is to convert the string to a rune slice, where each rune represents a single Unicode character, reverse the slice, and convert back to a string.&lt;/p&gt;
&lt;p&gt;A rune in Go represents a single Unicode code point, which can be multiple bytes. By converting to a rune slice first, you ensure that complex characters remain intact during the reversal operation. This is particularly important when working with internationalized text or emoji characters.&lt;/p&gt;</description></item><item><title>Splitting and Joining Strings in Go</title><link>https://tutorialedge.net/golang/snippets/splitting-and-joining-strings-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/splitting-and-joining-strings-go/</guid><description>&lt;p&gt;The &lt;code&gt;strings.Split&lt;/code&gt; function is used to break a string into a slice of substrings based on a delimiter, while &lt;code&gt;strings.Join&lt;/code&gt; combines a slice of strings into a single string with a separator. These are fundamental operations when working with formatted data like CSV files or comma-separated values.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Split&lt;/code&gt; takes a string and a separator, returning a slice of strings. If the separator is not found in the string, it returns a slice containing the original string. Conversely, &lt;code&gt;Join&lt;/code&gt; takes a slice of strings and a separator, combining them into a single string with the separator placed between each element.&lt;/p&gt;</description></item><item><title>Table-Driven Tests in Go</title><link>https://tutorialedge.net/golang/snippets/table-driven-tests-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/table-driven-tests-go/</guid><description>&lt;p&gt;Table-driven tests are the idiomatic Go testing pattern for writing comprehensive test suites with minimal code duplication. The pattern involves defining a slice of test cases as struct instances, where each struct contains input values and expected outputs. The test then iterates through the table, running each test case with &lt;code&gt;t.Run&lt;/code&gt; for organized subtest execution.&lt;/p&gt;
&lt;p&gt;This approach makes it easy to add new test cases by simply adding another struct instance to the table. The subtests generated by &lt;code&gt;t.Run&lt;/code&gt; provide clear, organized output showing which specific test cases pass or fail. This is especially valuable for edge cases, boundary conditions, and different input scenarios.&lt;/p&gt;</description></item><item><title>Trimming Whitespace from Strings in Go</title><link>https://tutorialedge.net/golang/snippets/trimming-whitespace-strings-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/trimming-whitespace-strings-go/</guid><description>&lt;p&gt;Go provides several string trimming functions in the &lt;code&gt;strings&lt;/code&gt; package to remove leading and trailing characters. The &lt;code&gt;TrimSpace&lt;/code&gt; function is the most commonly used, as it removes all leading and trailing whitespace characters including spaces, tabs, and newlines.&lt;/p&gt;
&lt;p&gt;For more granular control, you can use &lt;code&gt;Trim&lt;/code&gt;, which removes any characters from a specified set. The &lt;code&gt;TrimLeft&lt;/code&gt; and &lt;code&gt;TrimRight&lt;/code&gt; functions remove characters only from the left or right side of the string respectively. Here&amp;rsquo;s an example showing different trimming approaches:&lt;/p&gt;</description></item><item><title>Unmarshalling JSON into Structs in Go</title><link>https://tutorialedge.net/golang/snippets/unmarshal-json-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/unmarshal-json-in-go/</guid><description>&lt;p&gt;Unmarshalling is the process of converting JSON data into Go struct instances. The &lt;code&gt;json.Unmarshal&lt;/code&gt; function takes a byte slice of JSON data and a pointer to a struct, and populates the struct with values from the JSON. This is essential for working with APIs and parsing JSON from files or network requests.&lt;/p&gt;
&lt;p&gt;Struct tags tell the JSON decoder which JSON field maps to which struct field. The &lt;code&gt;json:&amp;quot;fieldname&amp;quot;&lt;/code&gt; tag is the standard way to specify this mapping. If a tag is omitted, the decoder uses the struct field name (case-insensitive matching). You can also use options like &lt;code&gt;omitempty&lt;/code&gt; and &lt;code&gt;string&lt;/code&gt; to control marshalling behavior.&lt;/p&gt;</description></item><item><title>Using Channels and Select in Go</title><link>https://tutorialedge.net/golang/snippets/channels-and-select-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/channels-and-select-go/</guid><description>&lt;p&gt;The select statement in Go allows you to wait on multiple channel operations simultaneously. Unlike a switch statement which evaluates conditions, select waits until one of its cases can proceed and then executes that case. This is the foundation of Go&amp;rsquo;s concurrency model for handling multiple communication channels.&lt;/p&gt;
&lt;p&gt;Select is particularly powerful because it blocks until at least one case can proceed, making it ideal for multiplexing. You can use it to listen on multiple channels, implement timeouts, or handle default cases for non-blocking receives. The select statement randomly chooses between multiple ready cases, which helps prevent bias in your concurrent programs.&lt;/p&gt;</description></item><item><title>Using Context for Cancellation and Timeouts in Go</title><link>https://tutorialedge.net/golang/snippets/context-cancellation-timeouts-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/context-cancellation-timeouts-go/</guid><description>&lt;p&gt;The context package is Go&amp;rsquo;s standard way to handle cancellation and timeouts across goroutines and API boundaries. A context carries deadlines, cancellation signals, and request-scoped values through your program. context.WithTimeout() creates a child context that automatically cancels after a specified duration, while context.WithCancel() allows manual cancellation.&lt;/p&gt;
&lt;p&gt;The key pattern is to check ctx.Done() in your goroutines using select statements. When a context is cancelled, its Done() channel closes, signaling all listening goroutines to stop. This propagates cancellation signals efficiently throughout your concurrent code without explicit shutdown mechanisms.&lt;/p&gt;</description></item><item><title>Using omitempty in Go JSON Marshaling</title><link>https://tutorialedge.net/golang/snippets/json-omitempty-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/json-omitempty-go/</guid><description>&lt;p&gt;The &lt;code&gt;omitempty&lt;/code&gt; struct tag option allows you to exclude fields with empty values from the JSON output. This is useful for reducing JSON payload size and keeping responses clean when certain optional fields are not set. When a field&amp;rsquo;s value matches the zero value for its type (empty string, zero for numbers, false for booleans, etc.), it will be omitted from the marshalled JSON.&lt;/p&gt;
&lt;p&gt;By adding &lt;code&gt;omitempty&lt;/code&gt; to your struct tags, you make it easy to handle optional fields in APIs and configuration files. This pattern is common in REST APIs where you want to only include fields that have meaningful values. It keeps JSON responses concise and makes it clear which fields are required versus optional.&lt;/p&gt;</description></item><item><title>Using WaitGroups for Goroutine Synchronization in Go</title><link>https://tutorialedge.net/golang/snippets/using-waitgroups-in-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/using-waitgroups-in-go/</guid><description>&lt;p&gt;A WaitGroup is a powerful synchronization primitive in Go that allows you to wait for a collection of goroutines to finish executing. The pattern is simple: call Add() before launching each goroutine, call Done() when a goroutine completes (typically using defer), and call Wait() to block until all goroutines are done.&lt;/p&gt;
&lt;p&gt;This is one of the most common ways to coordinate goroutines without using channels. It&amp;rsquo;s particularly useful when you don&amp;rsquo;t need to exchange data between goroutines but simply need to know when they&amp;rsquo;ve all finished their work. The defer wg.Done() pattern ensures that Done() is called even if the goroutine panics.&lt;/p&gt;</description></item><item><title>Worker Pool Pattern in Go</title><link>https://tutorialedge.net/golang/snippets/worker-pool-pattern-go/</link><pubDate>Mon, 09 Mar 2026 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/worker-pool-pattern-go/</guid><description>&lt;p&gt;The worker pool pattern is a fundamental Go concurrency pattern for distributing work across a fixed number of goroutines. Instead of creating a new goroutine for each task (which would be inefficient under high load), you maintain a constant pool of worker goroutines that all listen on the same jobs channel.&lt;/p&gt;
&lt;p&gt;This pattern scales well because you control the number of concurrent workers regardless of how many jobs you have. Workers receive jobs from the jobs channel and send their results to a results channel. When you close the jobs channel, all workers automatically exit their receive loop after processing remaining jobs.&lt;/p&gt;</description></item><item><title>Binary Search Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/80-binary-search-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/80-binary-search-algorithm-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to be covering the Binary Search algorithm and why it&amp;rsquo;s so incredibly efficient.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;p&gt;After exploring graph traversal, let&amp;rsquo;s shift gears and look at searching in sorted data. Binary Search is one of the most elegant and efficient algorithms out there.&lt;/p&gt;
&lt;p&gt;The key requirement: &lt;strong&gt;your data must be sorted&lt;/strong&gt;. But when it is, Binary Search is lightning fast. Instead of checking every element (linear search), we eliminate half the search space with each comparison. That&amp;rsquo;s the power of divide-and-conquer!&lt;/p&gt;</description></item><item><title>Breadth-First Search Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/70-breadth-first-search-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/70-breadth-first-search-algorithm-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to be covering Breadth-First Search (BFS) and how it works conceptually.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;p&gt;If DFS is like going deep into a maze, BFS is like exploring a maze level by level. Breadth-First Search explores all nodes at the current depth before moving to the next depth level. It&amp;rsquo;s perfect when you want to find the shortest path or explore neighbors before going deeper.&lt;/p&gt;</description></item><item><title>Bubble Sort Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/20-bubble-sort-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/20-bubble-sort-algorithm-overview/</guid><description>&lt;p&gt;Welcome Gophers! In this lesson, we are going to have a look at the Bubble Sort algorithm — how it works, its time complexity, and its characteristics.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;p&gt;Now the first algorithm that we are going to be looking at within this course is the bubble sort algorithm.&lt;/p&gt;
&lt;p&gt;The bubble sort algorithm is a comparision sorting algorithm that will repeatedly pass through a list and compare each element within the list against the next element. If the first element is greater than the next element then these elements will be swapped.&lt;/p&gt;</description></item><item><title>Building AI Agents in Go</title><link>https://tutorialedge.net/ai/building-ai-agents-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/building-ai-agents-in-go/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been following the AI space lately, you&amp;rsquo;ve probably heard the term &amp;ldquo;AI agents&amp;rdquo; tossed around a lot. But what exactly are they, and why should you care? More importantly, how can you build one in Go?&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;re going to explore the world of AI agents, understand what makes them tick, and then build a fully functional agent framework from scratch using Go. By the end, you&amp;rsquo;ll have a solid understanding of how agents work and the knowledge to build your own.&lt;/p&gt;</description></item><item><title>Building AI Applications with LangChainGo</title><link>https://tutorialedge.net/ai/building-ai-apps-with-langchaingo/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/building-ai-apps-with-langchaingo/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been curious about building AI-powered applications but don&amp;rsquo;t want to leave the comfort of Go, you&amp;rsquo;re in luck. LangChainGo is a fantastic library that brings the power of LangChain to the Go ecosystem, making it straightforward to build intelligent applications that interact with large language models.&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;re going to explore LangChainGo from the ground up. We&amp;rsquo;ll start with the basics, set up a project, connect to a local LLM, and build our way up to creating a stateful chatbot. Let&amp;rsquo;s dive in!&lt;/p&gt;</description></item><item><title>Building RAG Applications in Go</title><link>https://tutorialedge.net/ai/building-rag-applications-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/building-rag-applications-in-go/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been keeping up with the AI world lately, you&amp;rsquo;ve probably heard about Large Language Models (LLMs) being amazing but also having a bit of a problem: they can make stuff up. They&amp;rsquo;ll confidently tell you facts that are completely wrong. This is where RAG comes in, and it&amp;rsquo;s honestly one of the most practical ways to make LLMs actually useful for your specific domain.&lt;/p&gt;
&lt;p&gt;In this guide, we&amp;rsquo;re going to build a RAG application in Go that can answer questions based on documents you provide. By the end, you&amp;rsquo;ll have a working system that retrieves relevant information from your documents and uses an LLM to generate accurate answers.&lt;/p&gt;</description></item><item><title>Calling Ollama from a Go Application</title><link>https://tutorialedge.net/ai/calling-ollama-from-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/calling-ollama-from-go/</guid><description>&lt;p&gt;In this tutorial, we&amp;rsquo;re going to explore how to interact with Ollama directly from a Go application. Ollama runs a local REST API that lets you generate text, handle chat conversations, create embeddings, and more. The best part? It&amp;rsquo;s super straightforward to work with from Go.&lt;/p&gt;
&lt;p&gt;By the end of this guide, you&amp;rsquo;ll know how to make requests to Ollama, handle streaming responses, build a reusable client, and even create a simple chatbot API. Let&amp;rsquo;s dive in.&lt;/p&gt;</description></item><item><title>Depth-First Search Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/60-depth-first-search-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/60-depth-first-search-algorithm-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to be covering the Depth-First Search algorithm and how it works conceptually.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;p&gt;Now that we&amp;rsquo;ve covered sorting algorithms, let&amp;rsquo;s dive into graph traversal. Depth-First Search (DFS) is one of the most fundamental algorithms for exploring graphs and trees.&lt;/p&gt;
&lt;p&gt;Think of DFS like exploring a maze—you go as deep as possible down one path before backtracking and trying another. It&amp;rsquo;s called &amp;ldquo;depth-first&amp;rdquo; because we prioritize going deep over going wide.&lt;/p&gt;</description></item><item><title>Getting Started with Ollama - Running LLMs Locally</title><link>https://tutorialedge.net/ai/getting-started-with-ollama/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/getting-started-with-ollama/</guid><description>&lt;p&gt;If you&amp;rsquo;ve been wanting to experiment with large language models but don&amp;rsquo;t want to pay for API calls or send your data to third-party servers, Ollama might be exactly what you need. In this tutorial, we&amp;rsquo;ll walk through everything you need to know to get Ollama up and running on your machine.&lt;/p&gt;
&lt;h2 id="what-is-ollama-and-why-should-you-care"&gt;
 &lt;a href="#what-is-ollama-and-why-should-you-care" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is Ollama and Why Should You Care?&lt;/h2&gt;
&lt;p&gt;Ollama is a lightweight tool that makes it dead simple to run large language models (LLMs) locally on your own hardware. Think of it as a bridge between you and powerful AI models like Llama 3, Mistral, and others—but without needing to understand all the complex setup involved.&lt;/p&gt;</description></item><item><title>Heap Sort Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/50-heap-sort-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/50-heap-sort-algorithm-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to explore how the heap sort algorithm works and understand the heap data structure that powers it.&lt;/p&gt;
&lt;h2 id="what-is-a-heap"&gt;
 &lt;a href="#what-is-a-heap" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is a Heap?&lt;/h2&gt;
&lt;p&gt;A heap is a specialized tree-based data structure that satisfies the &lt;strong&gt;heap property&lt;/strong&gt;. In a &lt;strong&gt;max-heap&lt;/strong&gt;, every parent node is greater than or equal to its children. In a &lt;strong&gt;min-heap&lt;/strong&gt;, every parent node is less than or equal to its children.&lt;/p&gt;</description></item><item><title>Implementing Binary Search in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/81-binary-search-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/81-binary-search-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to be implementing the Binary Search algorithm that we looked at in the previous lesson.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a new file called &lt;code&gt;main.go&lt;/code&gt; within a new directory called &lt;code&gt;08-binary-search/&lt;/code&gt;. We&amp;rsquo;ll implement both iterative and recursive versions.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s create the iterative version of Binary Search:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// BinarySearch searches for a target value in a sorted slice&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Returns the index if found, or -1 if not found&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;BinarySearch&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; target &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	left &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	right &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;len&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;arr&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; left &lt;span style="color:#81a1c1"&gt;&amp;lt;=&lt;/span&gt; right &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		mid &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; left &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;right&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;left&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; arr&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;mid&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; target &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; mid
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; arr&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;mid&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt; target &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#616e87;font-style:italic"&gt;// Target is in the right half&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			left &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; mid &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#616e87;font-style:italic"&gt;// Target is in the left half&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			right &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; mid &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// Target not found&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s create the recursive version:&lt;/p&gt;</description></item><item><title>Implementing Breadth-First Search in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/71-breadth-first-search-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/71-breadth-first-search-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to be implementing the Breadth-First Search algorithm that we looked at in the previous lesson.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a new file called &lt;code&gt;main.go&lt;/code&gt; within a new directory called &lt;code&gt;07-bfs/&lt;/code&gt;. We&amp;rsquo;ll reuse the same Graph struct from our DFS implementation but implement BFS instead.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s define our Graph struct:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Graph represents an undirected graph using adjacency list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Graph &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	vertices &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	edges &lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;][]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// NewGraph creates a new graph with given number of vertices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;NewGraph&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;vertices &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Graph &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;Graph&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		vertices&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; vertices&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		edges&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;][]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// AddEdge adds an undirected edge between two vertices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;g &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Graph&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;AddEdge&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;u&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; v &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	g&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;edges&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;u&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;g&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;edges&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;u&lt;span style="color:#eceff4"&gt;],&lt;/span&gt; v&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	g&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;edges&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;v&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;g&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;edges&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;v&lt;span style="color:#eceff4"&gt;],&lt;/span&gt; u&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s implement the BFS function using a queue (slice):&lt;/p&gt;</description></item><item><title>Implementing Bubble Sort in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/21-bubble-sort-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/21-bubble-sort-in-go/</guid><description>&lt;p&gt;Welcome Gophers! In this lesson, we are going to implement the bubble sorting algorithm that we covered in the last lesson.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a new file called &lt;code&gt;main.go&lt;/code&gt; within a new directory called &lt;code&gt;01-bubble-sort/&lt;/code&gt;. I&amp;rsquo;ll be segregating each sorting and searching algorithm into a separate named directory under the one repository just for ease.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start by creating a simple main function that prints out something.&lt;/p&gt;</description></item><item><title>Implementing Depth-First Search in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/61-depth-first-search-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/61-depth-first-search-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to be implementing the Depth-First Search algorithm that we looked at in the previous lesson.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a new file called &lt;code&gt;main.go&lt;/code&gt; within a new directory called &lt;code&gt;06-dfs/&lt;/code&gt;. We&amp;rsquo;ll build a graph implementation and then implement DFS on it.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s define our Graph struct using an adjacency list representation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Graph represents an undirected graph using adjacency list&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Graph &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	vertices &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	edges &lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;][]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// NewGraph creates a new graph with given number of vertices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;NewGraph&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;vertices &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Graph &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;Graph&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		vertices&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; vertices&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		edges&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;][]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// AddEdge adds an undirected edge between two vertices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;g &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Graph&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;AddEdge&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;u&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; v &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	g&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;edges&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;u&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;g&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;edges&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;u&lt;span style="color:#eceff4"&gt;],&lt;/span&gt; v&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	g&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;edges&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;v&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;g&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;edges&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;v&lt;span style="color:#eceff4"&gt;],&lt;/span&gt; u&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s implement the recursive DFS function:&lt;/p&gt;</description></item><item><title>Implementing Heap Sort in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/51-heap-sort-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/51-heap-sort-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to implement the heap sort algorithm that we looked at in the previous lesson.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start by creating a new file called &lt;code&gt;main.go&lt;/code&gt; in a directory called &lt;code&gt;04-heap-sort/&lt;/code&gt;. We&amp;rsquo;ll build up the heap sort implementation step by step.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the basic setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Heap Sort Algorithm in Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, let&amp;rsquo;s define the function signatures we&amp;rsquo;ll need:&lt;/p&gt;</description></item><item><title>Implementing Insertion Sort in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/31-insertion-sort-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/31-insertion-sort-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to implement the insertion sort algorithm that we looked at in the previous lesson.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start by creating a new file called &lt;code&gt;main.go&lt;/code&gt; in a directory called &lt;code&gt;02-insertion-sort/&lt;/code&gt;. We&amp;rsquo;ll build up the InsertionSort function step by step, just like we did with bubble sort.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the basic setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Insertion Sorting Algorithm in Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, let&amp;rsquo;s define the function signature for our insertion sort function:&lt;/p&gt;</description></item><item><title>Implementing Merge Sort in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/41-merge-sort-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/41-merge-sort-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to implement the merge sort algorithm that we looked at in the previous lesson.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start by creating a new file called &lt;code&gt;main.go&lt;/code&gt; in a directory called &lt;code&gt;03-merge-sort/&lt;/code&gt;. We&amp;rsquo;ll build up the merge sort implementation step by step.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start with the basic setup:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Merge Sort Algorithm in Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, let&amp;rsquo;s define the function signatures for our merge sort functions. We need two functions: one for the main merge sort logic and one for merging two sorted slices:&lt;/p&gt;</description></item><item><title>Implementing Quick Sort in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/11-quick-sort-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/11-quick-sort-in-go/</guid><description>&lt;p&gt;Welcome Gophers! In this lesson, we are going to implement the Quick Sort algorithm in Go. In the last lesson, we covered how the algorithm works conceptually — now let&amp;rsquo;s put it into practice.&lt;/p&gt;
&lt;h2 id="setting-up"&gt;
 &lt;a href="#setting-up" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Setting Up&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s create a new file called &lt;code&gt;main.go&lt;/code&gt; in a directory called &lt;code&gt;02-quick-sort/&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Quick Sort Algorithm in Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="the-quicksort-function"&gt;
 &lt;a href="#the-quicksort-function" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The QuickSort Function&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start with our function signature. We want it to take a slice of ints and sort it in place:&lt;/p&gt;</description></item><item><title>Implementing Tree Search in Go</title><link>https://tutorialedge.net/courses/go-algorithms-course/91-tree-search-in-go/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/91-tree-search-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to be implementing a Binary Search Tree in Go.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a new file called &lt;code&gt;main.go&lt;/code&gt; within a new directory called &lt;code&gt;09-bst/&lt;/code&gt;. We&amp;rsquo;ll build a complete BST implementation from scratch.&lt;/p&gt;
&lt;p&gt;First, let&amp;rsquo;s define our Node struct:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Node represents a single node in the Binary Search Tree&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Node &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	value &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	left &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Node
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	right &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Node
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// NewNode creates a new node with a given value&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;NewNode&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Node &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;Node&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; value&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now let&amp;rsquo;s define our BST struct with the essential methods:&lt;/p&gt;</description></item><item><title>Insertion Sort Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/30-insertion-sort-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/30-insertion-sort-algorithm-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to look at how the insertion sort algorithm works, explore its time complexity, and see when you might want to use it over other sorting algorithms.&lt;/p&gt;
&lt;h2 id="how-insertion-sort-works"&gt;
 &lt;a href="#how-insertion-sort-works" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;How Insertion Sort Works&lt;/h2&gt;
&lt;p&gt;The insertion sort algorithm is a simple comparison-based sorting algorithm. It builds the final sorted array one element at a time by iterating through a list of items, comparing each item to the ones that came before it, and inserting it into the correct position in the already-sorted portion of the list.&lt;/p&gt;</description></item><item><title>Introduction to LLMs for Developers</title><link>https://tutorialedge.net/ai/introduction-to-llms-for-developers/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/ai/introduction-to-llms-for-developers/</guid><description>&lt;p&gt;So you&amp;rsquo;ve heard all the buzz about large language models (LLMs) and you&amp;rsquo;re wondering what they actually are and how you can use them in your projects. Great question. Whether you&amp;rsquo;re building a chatbot, enhancing your app with AI capabilities, or just want to understand what all the fuss is about, this guide is for you.&lt;/p&gt;
&lt;p&gt;The good news is that you don&amp;rsquo;t need a PhD in machine learning to work with LLMs. You just need to understand a few key concepts and know where to find the tools that fit your needs.&lt;/p&gt;</description></item><item><title>Merge Sort Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/40-merge-sort-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/40-merge-sort-algorithm-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to explore how the merge sort algorithm works and why it&amp;rsquo;s much more efficient than the simple sorting algorithms we&amp;rsquo;ve seen so far.&lt;/p&gt;
&lt;h2 id="how-merge-sort-works"&gt;
 &lt;a href="#how-merge-sort-works" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;How Merge Sort Works&lt;/h2&gt;
&lt;p&gt;Merge sort is an efficient, general-purpose, comparison-based sorting algorithm that uses a &lt;strong&gt;divide-and-conquer&lt;/strong&gt; approach. Instead of repeatedly comparing adjacent elements like bubble sort or insertion sort, merge sort divides the array into smaller pieces, sorts those pieces, and then merges them back together.&lt;/p&gt;</description></item><item><title>Quick Sort Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/10-quick-sort-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/10-quick-sort-algorithm-overview/</guid><description>&lt;p&gt;Welcome Gophers! In this lesson, we are going to be covering the Quick Sort algorithm — one of the most widely used sorting algorithms out there.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;p&gt;Quick Sort uses a technique called &lt;strong&gt;divide-and-conquer&lt;/strong&gt;. The basic idea is dead simple:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Pick a pivot&lt;/strong&gt; — Choose an element from the array (often the last element, but it can be random).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Partition&lt;/strong&gt; — Rearrange the array so that everything smaller than the pivot goes to the left, and everything larger goes to the right.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Recurse&lt;/strong&gt; — Apply the same process to the left and right partitions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Each time we partition, the pivot element ends up in its final sorted position. We keep recursing until every element has been a pivot and is in the right spot.&lt;/p&gt;</description></item><item><title>The Go Algorithms Crash Course</title><link>https://tutorialedge.net/courses/go-algorithms-course/01-course-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/01-course-overview/</guid><description>&lt;p&gt;Welcome Gophers! In this course, we are going to be covering some of the most popular sorting and searching algorithms and how you can implement them in Go.&lt;/p&gt;
&lt;h2 id="what-youll-learn"&gt;
 &lt;a href="#what-youll-learn" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What You&amp;rsquo;ll Learn&lt;/h2&gt;
&lt;p&gt;This course is split into two main sections: &lt;strong&gt;sorting algorithms&lt;/strong&gt; and &lt;strong&gt;searching algorithms&lt;/strong&gt;. For each algorithm, we follow the same two-part structure:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Algorithm Overview&lt;/strong&gt; — We&amp;rsquo;ll break down how the algorithm actually works, its time and space complexity, and when you&amp;rsquo;d want to use it in the real world.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Implementation in Go&lt;/strong&gt; — We&amp;rsquo;ll build the algorithm step-by-step in Go, test it, and make sure it actually works.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="sorting-algorithms"&gt;
 &lt;a href="#sorting-algorithms" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Sorting Algorithms&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;ll cover five of the most important sorting algorithms:&lt;/p&gt;</description></item><item><title>Tree Search Algorithm Overview</title><link>https://tutorialedge.net/courses/go-algorithms-course/90-tree-search-algorithm-overview/</link><pubDate>Sat, 07 Mar 2026 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-algorithms-course/90-tree-search-algorithm-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this lesson, we are going to be covering Tree Search algorithms, specifically working with Binary Search Trees (BSTs).&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;p&gt;While binary search on arrays is fantastic, Binary Search Trees take that idea and make it dynamic. Instead of needing to keep an array sorted, a BST maintains search properties through its structure.&lt;/p&gt;
&lt;p&gt;A &lt;strong&gt;Binary Search Tree&lt;/strong&gt; is a tree where for every node:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;All values in the left subtree are smaller&lt;/li&gt;
&lt;li&gt;All values in the right subtree are larger&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;This structure lets us search, insert, and delete efficiently—usually in logarithmic time!&lt;/p&gt;</description></item><item><title>Go Decorator Function Pattern Tutorial</title><link>https://tutorialedge.net/golang/go-decorator-function-pattern-tutorial/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/go-decorator-function-pattern-tutorial/</guid><description>&lt;p&gt;Decorators are certainly more prominent in other programming languages such as
Python and TypeScript, but that&amp;rsquo;s not to say you can&amp;rsquo;t use them in Go. In fact,
for certain problems, using decorators is the perfect solution as we&amp;rsquo;ll
hopefully be finding out in this tutorial.&lt;/p&gt;
&lt;h2 id="understanding-the-decorator-pattern"&gt;
 &lt;a href="#understanding-the-decorator-pattern" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Understanding the Decorator Pattern&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Decorators&lt;/strong&gt; essentially allow you to wrap existing functionality and append
or prepend your own custom functionality on top.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In Go, functions are deemed as first class objects which essentially means you
can pass them around just as you would a variable. Let&amp;rsquo;s see this in action with
a very simple example:&lt;/p&gt;</description></item><item><title>Securing Your Go REST APIs With JWTs</title><link>https://tutorialedge.net/golang/authenticating-golang-rest-api-with-jwts/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/authenticating-golang-rest-api-with-jwts/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - The full source code for this tutorial can be found here: &lt;a href="https://github.com/TutorialEdge/go-jwt-tutorial"
 title="TutorialEdge/go-jwt-tutorial" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 TutorialEdge/go-jwt-tutorial&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;JWTs, or JSON Web Tokens as they are more formally known, are a compact,
URL-safe means of representing claims to be transferred between two parties.
This is essentially a confusing way of saying that JWTs allow you to transmit
information from a client to the server in a stateless, but secure way.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;
 &lt;a href="#prerequisites" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;Before you can follow this article, you will need the following:&lt;/p&gt;</description></item><item><title>The Complete Guide to Building REST APIs in Go</title><link>https://tutorialedge.net/golang/go-rest-api-guide/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/go-rest-api-guide/</guid><description>&lt;h1 id="the-complete-guide-to-building-rest-apis-in-go"&gt;The Complete Guide to Building REST APIs in Go&lt;/h1&gt;
&lt;p&gt;Building REST APIs is one of the most common use cases for Go developers. Go&amp;rsquo;s performance characteristics, powerful standard library, and excellent support for concurrent operations make it an ideal choice for creating scalable, high-performance APIs. Whether you&amp;rsquo;re building microservices, backend systems, or full-featured web applications, Go provides the tools and patterns you need to succeed.&lt;/p&gt;
&lt;p&gt;In this comprehensive guide, we&amp;rsquo;ll explore everything you need to know about building REST APIs in Go, from foundational concepts to production-ready implementations.&lt;/p&gt;</description></item><item><title>The Complete Guide to Testing in Go</title><link>https://tutorialedge.net/golang/go-testing-guide/</link><pubDate>Sat, 07 Mar 2026 00:00:00 +0000</pubDate><guid>https://tutorialedge.net/golang/go-testing-guide/</guid><description>&lt;p&gt;Testing is a cornerstone of professional software development, and Go&amp;rsquo;s philosophy around testing is one of its greatest strengths. Unlike languages that require external testing frameworks, Go includes a built-in &lt;a href="./golang/intro-testing-in-go/"
 title="testing" 
 &gt;
 testing&lt;/a&gt; package in the standard library that provides everything you need for unit tests, benchmarks, and even fuzzing.&lt;/p&gt;
&lt;p&gt;This comprehensive guide walks through all aspects of testing in Go, from writing your first test to advanced patterns like table-driven tests, mocking, and integration testing. Whether you&amp;rsquo;re just starting out or looking to level up your testing game, you&amp;rsquo;ll find practical examples and links to deeper dives on each topic.&lt;/p&gt;</description></item><item><title>Supercharge Your Go Tests Using Fake HTTP Services</title><link>https://tutorialedge.net/golang/testing-with-fake-http-services-in-go/</link><pubDate>Sun, 20 Apr 2025 11:21:58 +0000</pubDate><guid>https://tutorialedge.net/golang/testing-with-fake-http-services-in-go/</guid><description>&lt;h2 id="why-testing-with-fakes-is-important"&gt;
 &lt;a href="#why-testing-with-fakes-is-important" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Testing With Fakes Is Important&lt;/h2&gt;
&lt;p&gt;Testing is a critical part of building reliable and maintainable Go applications. When your code interacts with external HTTP services, relying on real HTTP requests during tests can lead to flaky and inconsistent results. Network issues, rate limits, or changes in external APIs can all cause your tests to fail unpredictably. By using fake HTTP services, you can simulate real-world scenarios in a controlled environment, ensuring your tests are fast, reliable, and repeatable. In this article, we&amp;rsquo;ll explore how to set up fake HTTP services in Go to improve the confidence you have in your systems and streamline your testing process.&lt;/p&gt;</description></item><item><title>setval and nextval for PostgreSQL Sequences</title><link>https://tutorialedge.net/tips/postgres-set-nextval-sequence-manually/</link><pubDate>Sun, 01 Sep 2024 09:07:31 +0000</pubDate><guid>https://tutorialedge.net/tips/postgres-set-nextval-sequence-manually/</guid><description>&lt;p&gt;Sequences in PostgreSQL allow us to automatically insert the next value in a sequence within our applications.&lt;/p&gt;
&lt;p&gt;You may find yourself using sequences for things like primary key IDs, or maybe you have another use for them altogether.&lt;/p&gt;
&lt;p&gt;In this article, we are going to look at how you can get and set values to/from a sequence.&lt;/p&gt;
&lt;h2 id="getting-the-next-value-in-a-sequence"&gt;
 &lt;a href="#getting-the-next-value-in-a-sequence" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Getting The Next Value in a Sequence&lt;/h2&gt;
&lt;p&gt;If we have a sequence within our database, we can call the &lt;code&gt;nextval&lt;/code&gt; function, passing in the name of our sequence in order to get the next value in our sequence:&lt;/p&gt;</description></item><item><title>Replacing curl with HTTPie</title><link>https://tutorialedge.net/tips/using-httpie-to-replace-your-curl-commands/</link><pubDate>Sun, 01 Sep 2024 06:00:00 +0000</pubDate><guid>https://tutorialedge.net/tips/using-httpie-to-replace-your-curl-commands/</guid><description>&lt;p&gt;If you are building out http-based services, it&amp;rsquo;s almost inevitable that you&amp;rsquo;ll need to craft HTTP requests in order
to validate some of your endpoints.&lt;/p&gt;
&lt;p&gt;Recently, I&amp;rsquo;ve become a bit of a convert away from traditional &lt;code&gt;curl&lt;/code&gt; commands and started to adopt the tool &lt;code&gt;HTTPie&lt;/code&gt;,
which is potentially pronounced as HTT-pie?&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s been a fantastic little tool that allows me to craft more natural HTTP requests quickly and easily and also lets
me drop back down to raw &lt;code&gt;curl&lt;/code&gt; should I need it.&lt;/p&gt;</description></item><item><title>Crafting the Perfect Pull Request</title><link>https://tutorialedge.net/tips/crafting-the-perfect-pull-request/</link><pubDate>Mon, 19 Aug 2024 11:35:43 +0000</pubDate><guid>https://tutorialedge.net/tips/crafting-the-perfect-pull-request/</guid><description>&lt;p&gt;It&amp;rsquo;s become de facto in our day-to-day development to work on new features via a branch and open pull requests (or merge requests for GitLab users)
to merge any changes we&amp;rsquo;ve made on our development branches into a production or deployment branch.&lt;/p&gt;
&lt;p&gt;As a crafter of some seriously awful pull requests in my time, I figured it was worth sharing some handy reminders that will help you avoid
the most grievous of mistakes that I&amp;rsquo;ve succumbed to over the years.&lt;/p&gt;</description></item><item><title>Splitting Code Changes into Separate Commits</title><link>https://tutorialedge.net/tips/splitting-changes-commit-by-commit/</link><pubDate>Mon, 19 Aug 2024 11:35:43 +0000</pubDate><guid>https://tutorialedge.net/tips/splitting-changes-commit-by-commit/</guid><description>&lt;p&gt;The systems we build are inherently incredibly complex. The successful ones will encapsulate years of accumulated business
logic and context and hopefully, become legacy systems that future developers will complain about or perhaps suggest rewriting
entirely for no other reason that it&amp;rsquo;s a pain in their arse.&lt;/p&gt;
&lt;p&gt;There then comes a moment of time where someone, somewhere, will start working in a section of code that features a particularly
perplexing bit of logic that makes the unsuspecting developer go &amp;ldquo;huh?&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Aliasing your Git Commands for Maximum Productivity</title><link>https://tutorialedge.net/tips/aliasing-your-git-commands/</link><pubDate>Sat, 17 Aug 2024 11:35:43 +0000</pubDate><guid>https://tutorialedge.net/tips/aliasing-your-git-commands/</guid><description>&lt;p&gt;This is a little tip for those of you wanting to optimize your developer productivity and reduce the
toil around some of the tasks that you&amp;rsquo;ll perform likely hundreds of times per week.&lt;/p&gt;
&lt;p&gt;I tend to spend a lot of time raising pull requests, writing commits or running various git commands
in order to get my current working branch in order prior to getting it merged into production.&lt;/p&gt;
&lt;p&gt;It can feel a little tedious running &lt;code&gt;git add -p&lt;/code&gt; or &lt;code&gt;git add -A&lt;/code&gt; followed by &lt;code&gt;git commit -m &amp;quot;blah&amp;quot;&lt;/code&gt;
and finally either a &lt;code&gt;git push origin main&lt;/code&gt; or &lt;code&gt;git rebase -i origin/main&lt;/code&gt; depending on what stage
of the cycle I&amp;rsquo;m in.&lt;/p&gt;</description></item><item><title>Go JSON Tutorial</title><link>https://tutorialedge.net/golang/go-json-tutorial/</link><pubDate>Fri, 16 Aug 2024 19:07:28 +0000</pubDate><guid>https://tutorialedge.net/golang/go-json-tutorial/</guid><description>&lt;p&gt;Welcome fellow Gophers! In this tutorial, we are going to be taking a
comprehensive look at how we can work with JSON in our Go applications.&lt;/p&gt;
&lt;p&gt;JSON, or JavaScript Object Notation, is without a doubt the most popular data
format for sending and receiving data across the web. All major languages
support the data format by default and Go is no different.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&gt; - The full source code for this tutorial can be found here:
&lt;a href="https://github.com/TutorialEdge/go-json-tutorial"
 title="TutorialEdge/go-json-tutorial" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 TutorialEdge/go-json-tutorial&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Go 1.23 Iterators Tutorial</title><link>https://tutorialedge.net/golang/go-123-iterators-tutorial/</link><pubDate>Wed, 14 Aug 2024 09:00:00 +0100</pubDate><guid>https://tutorialedge.net/golang/go-123-iterators-tutorial/</guid><description>&lt;p&gt;👋 Howdy Gophers!&lt;/p&gt;
&lt;p&gt;Go 1.23 is fresh off the proverbial press courtesy of the Go team and with it comes the new range-over-func syntax into the language core!&lt;/p&gt;
&lt;p&gt;This article is going to explore this new functionality and demonstrate how you can pull this into your own Go application development for fame and hopefully, some fortune to boot!&lt;/p&gt;
&lt;h2 id="the-range-over-func-experiment"&gt;
 &lt;a href="#the-range-over-func-experiment" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Range-over-func Experiment&lt;/h2&gt;
&lt;p&gt;This new syntax was originally pulled into the previous Go 1.22 release as an experiment that you could play about with using the &lt;code&gt;GOEXPERIMENT=rangefunc&lt;/code&gt; flag. It&amp;rsquo;s since matured and
has been generally accepted as a fantastic new addition to the language.&lt;/p&gt;</description></item><item><title>Functional Options Parameter Pattern in Go</title><link>https://tutorialedge.net/golang/functional-options-parameter-pattern-in-go/</link><pubDate>Wed, 10 Jan 2024 08:48:11 +0000</pubDate><guid>https://tutorialedge.net/golang/functional-options-parameter-pattern-in-go/</guid><description>&lt;p&gt;Welcome Gophers!&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be covering the Functional Options Parameter Pattern in Go and how you can use it to really improve the way that you customize components within your Go applications:&lt;/p&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;p&gt;This tutorial is also available in video format:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/DMha2HRI5lE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;</description></item><item><title>Joining Errors With errors.Join in Go</title><link>https://tutorialedge.net/golang/joining-errors-with-errors-join-in-go/</link><pubDate>Tue, 02 Jan 2024 18:37:29 +0000</pubDate><guid>https://tutorialedge.net/golang/joining-errors-with-errors-join-in-go/</guid><description>&lt;p&gt;In Go 1.20, a powerful new feature was introduced: &lt;code&gt;errors.Join&lt;/code&gt;. This allows you to combine multiple errors into a single error value, making it easier to handle and report on multiple failures that occur during the execution of your code.&lt;/p&gt;
&lt;p&gt;This is super handy if you want to enrich the errors that may be getting returned from parts of your Go application and allows you to do better error checking further down the chain.&lt;/p&gt;</description></item><item><title>Getting Started With Testmain in Go</title><link>https://tutorialedge.net/golang/getting-started-with-testmain-in-go/</link><pubDate>Mon, 01 Jan 2024 20:28:35 +0000</pubDate><guid>https://tutorialedge.net/golang/getting-started-with-testmain-in-go/</guid><description>&lt;p&gt;Welcome gophers!&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be covering how you can use TestMain in order to simplify your tests in Go as well as covering some of the potential drawbacks and caveats to consider when employing this approach.&lt;/p&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;p&gt;This tutorial is also available in video format:&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/MAdwtwHzGP4?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h2 id="the-testmain-function"&gt;
 &lt;a href="#the-testmain-function" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The TestMain Function&lt;/h2&gt;
&lt;p&gt;So, the TestMain function is rather special in the sense that, if it is present within a package, it then becomes the main entry point for running the tests within that package.&lt;/p&gt;</description></item><item><title>The Go Learning Path</title><link>https://tutorialedge.net/paths/golang/</link><pubDate>Mon, 01 Jan 2024 00:00:00 +0000</pubDate><guid>https://tutorialedge.net/paths/golang/</guid><description>&lt;p&gt;Go is a statically typed, compiled language designed at Google for writing reliable, efficient software. It has become one of the most in-demand languages for backend development, cloud infrastructure, and systems programming — powering tools like Docker, Kubernetes, and Terraform.&lt;/p&gt;
&lt;p&gt;This learning path is designed to take you from your first &lt;code&gt;go run&lt;/code&gt; all the way to building production-grade distributed systems. Each level builds on the last, pairing structured video courses with hand-picked free resources and books so you always have the right material at the right time.&lt;/p&gt;</description></item><item><title>Beginner's Guide to Logging in Tests in Go</title><link>https://tutorialedge.net/golang/intro-to-logging-in-tests-golang/</link><pubDate>Fri, 29 Dec 2023 12:22:17 +0000</pubDate><guid>https://tutorialedge.net/golang/intro-to-logging-in-tests-golang/</guid><description>&lt;p&gt;Welcome Gophers! In this tutorial, we&amp;rsquo;re going to be looking at how you can add log messages to your Go unit tests.&lt;/p&gt;
&lt;p&gt;This is critical as your suite of tests around your applications grows over time. You want to be able to quickly identify why a test has failed so that you can quickly start digging into how to fix it.&lt;/p&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/UVfXsyHaDGc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h2 id="log-and-logf"&gt;
 &lt;a href="#log-and-logf" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Log and Logf&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start with &lt;code&gt;Log&lt;/code&gt; and &lt;code&gt;Logf&lt;/code&gt; methods. These are helpful logging methods that hang off the &lt;code&gt;*testing.T&lt;/code&gt; struct available to
us within our test functions:&lt;/p&gt;</description></item><item><title>Using T.Cleanup for Test Teardown in Go</title><link>https://tutorialedge.net/golang/t-cleanup-tutorial-in-go/</link><pubDate>Thu, 21 Dec 2023 11:45:41 +0000</pubDate><guid>https://tutorialedge.net/golang/t-cleanup-tutorial-in-go/</guid><description>&lt;p&gt;When you&amp;rsquo;re writing tests in Go, you often need to set up resources—temporary files, database connections, test servers—and then clean them up after your tests complete. For years, Gophers relied on &lt;code&gt;defer&lt;/code&gt; statements and careful test organization to handle this. Then came Go 1.14 with &lt;code&gt;t.Cleanup()&lt;/code&gt;, a cleaner and more reliable way to manage test teardown.&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll explore how &lt;code&gt;t.Cleanup()&lt;/code&gt; works, how it differs from &lt;code&gt;defer&lt;/code&gt;, and when you should use it to write better, more maintainable tests.&lt;/p&gt;</description></item><item><title>Writing Clean Functions in Go with the Full Mapping Strategy</title><link>https://tutorialedge.net/golang/clean-architecture-fully-mapped-functions-in-go/</link><pubDate>Tue, 08 Aug 2023 22:00:47 +0100</pubDate><guid>https://tutorialedge.net/golang/clean-architecture-fully-mapped-functions-in-go/</guid><description>&lt;p&gt;Over the past few months, I&amp;rsquo;ve been heavily involved in building out new critical systems within a new team that is ultimately at the start of its Go development journey.&lt;/p&gt;
&lt;p&gt;I was tasked with coming in, helping to deliver this new system and also to help build confidence within the team when they are making changes to this system and subsequently help with delivery timelines.&lt;/p&gt;
&lt;p&gt;Now, I needed a way to make sure the system was as simple as possible, and a lot of time was spent decoupling tightly coupled components. One of the techniques I used to achieve this was using explicit input and output structs for all of the functions and methods within the code.&lt;/p&gt;</description></item><item><title>Building Our Code</title><link>https://tutorialedge.net/courses/go-ci-course/03-building-our-code/</link><pubDate>Sat, 15 Apr 2023 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-ci-course/03-building-our-code/</guid><description/></item><item><title>Go CI Course - Course Overview</title><link>https://tutorialedge.net/courses/go-ci-course/01-course-overview/</link><pubDate>Sat, 15 Apr 2023 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-ci-course/01-course-overview/</guid><description/></item><item><title>Linting Our Code</title><link>https://tutorialedge.net/courses/go-ci-course/04-building-and-linting/</link><pubDate>Sat, 15 Apr 2023 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-ci-course/04-building-and-linting/</guid><description/></item><item><title>Project Setup and CI Overview</title><link>https://tutorialedge.net/courses/go-ci-course/02-project-setup-and-ci-overview/</link><pubDate>Sat, 15 Apr 2023 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-ci-course/02-project-setup-and-ci-overview/</guid><description/></item><item><title>Testing and Test Coverage Jobs</title><link>https://tutorialedge.net/courses/go-ci-course/05-adding-test-jobs/</link><pubDate>Sat, 15 Apr 2023 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-ci-course/05-adding-test-jobs/</guid><description/></item><item><title>Privacy Policy</title><link>https://tutorialedge.net/privacy/</link><pubDate>Fri, 24 Mar 2023 12:28:13 +0100</pubDate><guid>https://tutorialedge.net/privacy/</guid><description>&lt;p&gt;We at TutorialEdge.net take your privacy very seriously. This privacy policy explains how we collect, use, and protect your personal information.&lt;/p&gt;
&lt;h2 id="information-collection-and-use"&gt;
 &lt;a href="#information-collection-and-use" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Information Collection and Use&lt;/h2&gt;
&lt;p&gt;We collect personal information from you when you register for an account, subscribe to our newsletter, make a purchase, or use any of our services. This information may include your name, email address, payment information, and account data.&lt;/p&gt;
&lt;p&gt;We use this information to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Provide and improve our services&lt;/li&gt;
&lt;li&gt;Process payments&lt;/li&gt;
&lt;li&gt;Send you information about our services and promotions&lt;/li&gt;
&lt;li&gt;Personalize your user experience&lt;/li&gt;
&lt;li&gt;Analyze and track usage of our services&lt;/li&gt;
&lt;li&gt;Provide customer support&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nformation-sharing"&gt;
 &lt;a href="#nformation-sharing" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;nformation Sharing&lt;/h2&gt;
&lt;p&gt;We do not sell or rent your personal information to third parties for their marketing purposes without your explicit consent. However, we may share your information with third-party service providers that assist us in providing our services, such as:&lt;/p&gt;</description></item><item><title>A Simple Dockerfile For Go Applications</title><link>https://tutorialedge.net/courses/docker-for-beginners/05-go-app-dockerfiles/</link><pubDate>Sun, 12 Mar 2023 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/05-go-app-dockerfiles/</guid><description>&lt;p&gt;At this point in the course, we should have at least a basic grasp as to how we can create docker images and run them as containers.&lt;/p&gt;
&lt;p&gt;In this video, we&amp;rsquo;ll be expanding on the concepts we&amp;rsquo;ve covered and look at how we can build a single-stage Dockerfile for our Go applications.&lt;/p&gt;
&lt;h2 id="our-go-app"&gt;
 &lt;a href="#our-go-app" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our Go App&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a lightweight Go application that runs on &lt;code&gt;localhost:3000&lt;/code&gt; and returns &lt;code&gt;Hello World&lt;/code&gt; whenever someone hits the server.&lt;/p&gt;</description></item><item><title>Docker-compose for your Go Applications</title><link>https://tutorialedge.net/courses/docker-for-beginners/07-docker-compose/</link><pubDate>Sun, 12 Mar 2023 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/07-docker-compose/</guid><description>&lt;h2 id="commands-run"&gt;
 &lt;a href="#commands-run" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Commands Run&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;# runs our docker-compose file &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker-compose up 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;# runs docker-compose in detached mode&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker-compose up -d
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;# gets the container IDs &lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker ps
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;# exec into the postgres container by container id&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker &lt;span style="color:#81a1c1"&gt;exec&lt;/span&gt; -it CONTAINERID bash
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;# Log into postgres&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ psql -U postgres 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Dockerhub Overview</title><link>https://tutorialedge.net/courses/docker-for-beginners/08-dockerhub-overview/</link><pubDate>Sun, 12 Mar 2023 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/08-dockerhub-overview/</guid><description/></item><item><title>Multistage Dockerfiles For Your Go Apps!</title><link>https://tutorialedge.net/courses/docker-for-beginners/06-multi-stage-dockerfiles/</link><pubDate>Sun, 12 Mar 2023 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/06-multi-stage-dockerfiles/</guid><description>&lt;p&gt;In this video, we are going to be taking a look at how we can evolve our single stage dockerfile into a multistage dockerfile.&lt;/p&gt;
&lt;p&gt;Finished Dockerfile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-Dockerfile" data-lang="Dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;FROM&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;golang:latest&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;AS&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;builder&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;/app&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;COPY&lt;/span&gt; . .&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;RUN&lt;/span&gt; CGO_ENABLED&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt; GOOS&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;linux go build -o main main.go&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;# Second stage of our application&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;FROM&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;alpine:latest&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;AS&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;production&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;COPY&lt;/span&gt; --from&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;builder /app .&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;CMD&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;./main&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="commands-in-video"&gt;
 &lt;a href="#commands-in-video" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Commands in Video:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker build -t multistage-go-app .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker run -it -p 3000:3000 multistage-go-app
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker run -d 3000:3000 multistage-go-app
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker images &lt;span style="color:#eceff4"&gt;|&lt;/span&gt; grep my-go-app
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ docker images &lt;span style="color:#eceff4"&gt;|&lt;/span&gt; grep multistage-go-app
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Improving Error Handling</title><link>https://tutorialedge.net/courses/go-http-client-course/07-improving-error-handling/</link><pubDate>Tue, 03 Jan 2023 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-http-client-course/07-improving-error-handling/</guid><description>&lt;p&gt;In this video, we are going to look at how we can improve the way we define and return errors from our HTTP client.&lt;/p&gt;</description></item><item><title>Bootstrapping our HTTP Client</title><link>https://tutorialedge.net/courses/go-http-client-course/02-bootstrap-our-client/</link><pubDate>Thu, 22 Dec 2022 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-http-client-course/02-bootstrap-our-client/</guid><description>&lt;p&gt;The first thing we&amp;rsquo;ll need to do, is to instantiate our project:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ git remote add origin https://github.com/...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ go mod init github.com/TutorialEdge/go-http-client
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Course Overview</title><link>https://tutorialedge.net/courses/go-http-client-course/01-course-overview/</link><pubDate>Thu, 22 Dec 2022 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-http-client-course/01-course-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers, to the first video of my course - Building Production-Grade HTTP Clients in Go.&lt;/p&gt;</description></item><item><title>Greater Customization of The Client</title><link>https://tutorialedge.net/courses/go-http-client-course/05-option-function-parameter-pattern/</link><pubDate>Thu, 22 Dec 2022 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-http-client-course/05-option-function-parameter-pattern/</guid><description/></item><item><title>Improving Test Coverage with httptest</title><link>https://tutorialedge.net/courses/go-http-client-course/06-test-server-unit-tests/</link><pubDate>Thu, 22 Dec 2022 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-http-client-course/06-test-server-unit-tests/</guid><description/></item><item><title>Making HTTP Requests</title><link>https://tutorialedge.net/courses/go-http-client-course/03-making-http-requests/</link><pubDate>Thu, 22 Dec 2022 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-http-client-course/03-making-http-requests/</guid><description/></item><item><title>Testing the Client With Calls to the Live API</title><link>https://tutorialedge.net/courses/go-http-client-course/04-testing-the-client/</link><pubDate>Thu, 22 Dec 2022 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-http-client-course/04-testing-the-client/</guid><description/></item><item><title>Handling Panics in Go</title><link>https://tutorialedge.net/golang/snippets/handling-panics-in-go/</link><pubDate>Sun, 18 Dec 2022 12:46:58 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/handling-panics-in-go/</guid><description>&lt;p&gt;In Go, a panic is an exceptional condition that occurs when a program cannot continue to execute in a normal way. When a panic occurs, the program will stop executing and will print a stack trace to the console.&lt;/p&gt;
&lt;p&gt;There are several ways to handle panics in Go. One way is to use the recover function from the builtin package. The recover function allows you to catch and handle a panic in a deferred function.&lt;/p&gt;</description></item><item><title>Variadic Functions in Go</title><link>https://tutorialedge.net/golang/snippets/variadic-functions-in-go/</link><pubDate>Sun, 18 Dec 2022 12:46:58 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/variadic-functions-in-go/</guid><description>&lt;p&gt;A variadic function is a function that can accept a variable number of arguments. In Go, a variadic function is indicated by an ellipsis (&amp;hellip;) preceding the type of the final parameter in the function signature. For example, here is a simple variadic function that takes a variable number of integers and returns their sum:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;sum&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;nums &lt;span style="color:#81a1c1"&gt;...&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	total &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; num &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; nums &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		total &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; num
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; total
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;To call this function, you can pass it any number of integers as arguments. For example:&lt;/p&gt;</description></item><item><title>Embedding Lua Scripts in Go with Shopify/go-lua</title><link>https://tutorialedge.net/golang/embedding-lua-scripts-in-go/</link><pubDate>Sat, 17 Dec 2022 20:00:02 +0100</pubDate><guid>https://tutorialedge.net/golang/embedding-lua-scripts-in-go/</guid><description>&lt;p&gt;Welcome Gophers! In this tutorial, we are going to be taking a look at how we can embed Lua scripts in our Go applications.&lt;/p&gt;
&lt;h2 id="getting-started"&gt;
 &lt;a href="#getting-started" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Getting Started&lt;/h2&gt;
&lt;p&gt;You can use the &lt;code&gt;Shopify/go-lua&lt;/code&gt; package to embed Lua in Go. Here&amp;rsquo;s an example of how to do it:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/Shopify/go-lua&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// Create a new Lua state&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	l &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; lua&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;NewState&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;defer&lt;/span&gt; l&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Close&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// Load the standard libraries&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	lua&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;OpenLibraries&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;l&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// Load and run a Lua script&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; lua&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;DoFile&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;l&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;script.lua&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;);&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This example loads and runs a Lua script called &amp;ldquo;script.lua&amp;rdquo;. You can also execute Lua code directly by using the &lt;code&gt;DoString&lt;/code&gt; function:&lt;/p&gt;</description></item><item><title>Generating UUIDs in Go</title><link>https://tutorialedge.net/golang/snippets/generate-uuids-in-go/</link><pubDate>Sat, 17 Dec 2022 20:00:02 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/generate-uuids-in-go/</guid><description>&lt;p&gt;In Go, you can use the uuid package to generate universally unique identifiers (UUIDs). Here&amp;rsquo;s an example of how to generate a random UUID:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	uuid &lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/satori/go.uuid&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// Generate a random UUID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	u1 &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; uuid&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;NewV4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;UUIDv4: %s\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; u1&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will output a string representation of a UUID in the form of &lt;code&gt;xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx&lt;/code&gt;, where x is a hexadecimal digit.&lt;/p&gt;
&lt;p&gt;If you need to generate a UUID based on a specific input, you can use the NewV5 function and provide a namespace and a name as arguments. For example:&lt;/p&gt;</description></item><item><title>Build a Go Serverless App in 5 Minutes With Sst</title><link>https://tutorialedge.net/golang/build-a-go-serverless-app-in-5-minutes-with-sst/</link><pubDate>Sat, 03 Dec 2022 16:39:33 +0000</pubDate><guid>https://tutorialedge.net/golang/build-a-go-serverless-app-in-5-minutes-with-sst/</guid><description>&lt;p&gt;Welcome Gophers! 👋 In this video, we are going to look at what it takes to build a serverless application in Go in 5 minutes using SST.&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/mc5LnvzKJtE?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;</description></item><item><title>A Few of a Senior Software Engineer's Top Priorities</title><link>https://tutorialedge.net/software-eng/senior-engineers-top-priorities/</link><pubDate>Mon, 10 Oct 2022 19:05:57 +0100</pubDate><guid>https://tutorialedge.net/software-eng/senior-engineers-top-priorities/</guid><description>&lt;p&gt;Howdy folks! It&amp;rsquo;s been a long while since I&amp;rsquo;ve put pen to proverbially paper
and written new content for the site. With winter on the horizon and
the long, dark nights approaching, what better a time to get back into writing.&lt;/p&gt;
&lt;p&gt;This post encapsulates my own thoughts on some of the topics I consider most
important for Senior Software Engineers always be thinking about when developing systems professionally.&lt;/p&gt;
&lt;h2 id="who-am-i"&gt;
 &lt;a href="#who-am-i" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Who am I?&lt;/h2&gt;
&lt;p&gt;These kind of posts always need some form of author qualification - My name is Elliot, and I&amp;rsquo;ve been a software engineer for over 8 years now.&lt;/p&gt;</description></item><item><title>Interactive Test Case</title><link>https://tutorialedge.net/courses/interactive-test/</link><pubDate>Fri, 01 Jul 2022 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/interactive-test/</guid><description>&lt;p&gt;As we gain further experience, the list of spells we know grows and the number of paths we can take in-combat situations
can grow to great lengths.&lt;/p&gt;
&lt;p&gt;In order to handle this increasing complexity over time, it may be apt to change how we decide what to return from an &lt;code&gt;if&lt;/code&gt; statement to a &lt;code&gt;switch&lt;/code&gt; statement:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;switch&lt;/span&gt; attackType &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;charge&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;dodge&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;bolt&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;energy shield&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;case&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;stab&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;parry&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;default&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;run&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="task"&gt;
 &lt;a href="#task" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Task&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;SelectSpell&lt;/code&gt; function takes in an enemy type which is of type string. We need to be able to decide quickly what spell to use with a &lt;code&gt;switch&lt;/code&gt; statement.&lt;/p&gt;</description></item><item><title>Creating Real-Time Chat and Activity Systems With Getstream.io</title><link>https://tutorialedge.net/golang/creating-real-time-chat-systems-with-getstream-io/</link><pubDate>Fri, 24 Jun 2022 10:00:44 +0100</pubDate><guid>https://tutorialedge.net/golang/creating-real-time-chat-systems-with-getstream-io/</guid><description>&lt;blockquote&gt;
&lt;p&gt;If you fancy trying their product offering out for yourself, then please feel free to create a new maker account using this link - &lt;a href="https://getstream.io/maker-account/?utm_source=Youtube&amp;amp;utm_medium=Video_Episode&amp;amp;utm_content=Developer&amp;amp;utm_campaign=TutorialEdge_July2022_MakerAccount_klmh22"
 title="Create a Maker Account" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Create a Maker Account&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome Gophers, in this video, we&amp;rsquo;ll be covering how you can build real-time activity and chat systems on top of GetStream.io&amp;rsquo;s fantastic services!&lt;/p&gt;
&lt;div style="position: relative; padding-bottom: 56.25%; height: 0; overflow: hidden;"&gt;
 &lt;iframe allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share; fullscreen" loading="eager" referrerpolicy="strict-origin-when-cross-origin" src="https://www.youtube.com/embed/wqArtyADnXc?autoplay=0&amp;amp;controls=1&amp;amp;end=0&amp;amp;loop=0&amp;amp;mute=0&amp;amp;start=0" style="position: absolute; top: 0; left: 0; width: 100%; height: 100%; border:0;" title="YouTube video"&gt;&lt;/iframe&gt;
 &lt;/div&gt;

&lt;h2 id="conclusion"&gt;
 &lt;a href="#conclusion" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you have any thoughts or comments then I&amp;rsquo;d love to hear them in the comments section below!&lt;/p&gt;</description></item><item><title>Welcome to the Community Forum!</title><link>https://tutorialedge.net/community/welcome-to-the-community-forum/</link><pubDate>Fri, 17 Jun 2022 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/community/welcome-to-the-community-forum/</guid><description>&lt;p&gt;Welcome all to the community forum!!&lt;/p&gt;
&lt;p&gt;I'm delighted to finally be able to offer you the ability to contribute your own posts up onto TutorialEdge. It's certainly been something that has been a long time coming and plenty of people have asked for this in the past.&lt;/p&gt;
&lt;p&gt;Well, here it is! The beta version of the system is now live and ready to go!&lt;/p&gt;
&lt;p&gt;Through the editor, you will be able to craft your helpful post using markdown to style it. Once you are happy with it, hit the publish button and a new pull-request will be created on the repository that powers this site!&lt;/p&gt;</description></item><item><title>Go Garbage Collection Overview</title><link>https://tutorialedge.net/golang/go-garbage-collection-overview/</link><pubDate>Wed, 15 Jun 2022 19:15:57 +0100</pubDate><guid>https://tutorialedge.net/golang/go-garbage-collection-overview/</guid><description>&lt;p&gt;Garbage Collection is one of the key benefits that Go features. It allows Go developers to focus more on the business
problems that they are presented and spend slightly less time on the more tedious matter of managing memory and ensuring
our stacks and heaps don&amp;rsquo;t grow infinitely due a misplaced variable assignment or two.&lt;/p&gt;
&lt;h1 id="introduction"&gt;Introduction&lt;/h1&gt;
&lt;p&gt;Garbage collection is an automatic memory management system that frees you from manually allocating and deallocating memory. When you create objects in your Go program, they are allocated on the heap. Go&amp;rsquo;s garbage collector automatically detects when objects are no longer in use and reclaims that memory.&lt;/p&gt;</description></item><item><title>Taskfiles for Go Developers</title><link>https://tutorialedge.net/golang/taskfiles-for-go-developers/</link><pubDate>Sun, 12 Jun 2022 11:43:58 +0100</pubDate><guid>https://tutorialedge.net/golang/taskfiles-for-go-developers/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this tutorial, I&amp;rsquo;m going to be demonstrating how you can utilize
Taskfiles for fame and fortune within your Go application development.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;(Disclaimer): This article was prompted by the adoption of Taskfiles within CircleCI to aid them in their adoption of Go. I can&amp;rsquo;t take any credit for discovering Taskfiles as it was another team that highlighted the advantages.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you&amp;rsquo;ve been part of the Go community for a while, you may be familiar with the use of Makefiles or similar build tooling within Go applications, you may even have opted for some form of script to capture some of the longer commands for easier development.&lt;/p&gt;</description></item><item><title>Rust Docker Tutorial</title><link>https://tutorialedge.net/rust/rust-docker-tutorial/</link><pubDate>Tue, 24 May 2022 19:09:23 +0100</pubDate><guid>https://tutorialedge.net/rust/rust-docker-tutorial/</guid><description>&lt;p&gt;Welcome all! In this tutorial, we are going to be looking at a few different ways that we can effectively
dockerize our Rust applications and run them as containers.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m making more of an effort these days to learn Rust and expand my skillset, as a result, I am going to be writing
more articles based on Rust as a method for helping myself learn and hopefully help demystify topics for other people
in a similar position.&lt;/p&gt;</description></item><item><title>An Overview of Essential Go Tools</title><link>https://tutorialedge.net/golang/go-tools-overview/</link><pubDate>Wed, 11 May 2022 08:40:37 +0100</pubDate><guid>https://tutorialedge.net/golang/go-tools-overview/</guid><description>&lt;p&gt;One of the things that makes Go such a fantastic language to work with is the comprehensive set of tools that come built into the standard distribution. The Go team has embraced a philosophy of &amp;ldquo;batteries included&amp;rdquo; and strong conventions over configuration, which means you spend less time setting up tools and more time writing code.&lt;/p&gt;
&lt;p&gt;In this article, we&amp;rsquo;re going to walk through the most essential tools in the Go toolchain. Whether you&amp;rsquo;re just starting out or you&amp;rsquo;ve been writing Go for years, you&amp;rsquo;ll find these tools invaluable for writing, testing, and maintaining Go applications.&lt;/p&gt;</description></item><item><title>Panic Recovery in Go - Tutorial</title><link>https://tutorialedge.net/golang/go-panic-recovery-tutorial/</link><pubDate>Tue, 10 May 2022 17:49:53 +0100</pubDate><guid>https://tutorialedge.net/golang/go-panic-recovery-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to be covering the concept of panic recovery in Go.&lt;/p&gt;
&lt;h2 id="panics-in-go"&gt;
 &lt;a href="#panics-in-go" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Panics in Go&lt;/h2&gt;
&lt;p&gt;Panics are something I very rarely use within my day-to-day Go application development. Most of the time, catching an error from whatever I&amp;rsquo;m calling and then logging it out and possibly emitting a metric that lets me know how often this is happening is the preferential option.&lt;/p&gt;
&lt;p&gt;Panics are not meant to be comparable to exceptions in other languages - by this I mean that you will not see Go developers use them the same way PHP developers, Java Developers or JavaScript developers might use them within their own language domains.&lt;/p&gt;</description></item><item><title>CircleCI Project Setup</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/080-circleci-project-setup/</link><pubDate>Fri, 06 May 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/080-circleci-project-setup/</guid><description/></item><item><title>Accepting Interfaces and Returning Structs</title><link>https://tutorialedge.net/golang/accept-interfaces-return-structs/</link><pubDate>Wed, 27 Apr 2022 12:08:41 +0100</pubDate><guid>https://tutorialedge.net/golang/accept-interfaces-return-structs/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this article, we are going to be covering the concept of &lt;code&gt;accepting interfaces and returning structs&lt;/code&gt; and how this can help improve your code to make it more testable as well as maintainable.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;p&gt;When writing Go applications, one of the key things I like to keep in mind is &amp;ldquo;how can I make this particular function as testable as possible?&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;For more complex applications, being able to exercise all of the various code-paths within our application can be a bit of a nightmare depending on the way that we architect certain components.&lt;/p&gt;</description></item><item><title>Validating HTTP JSON Requests in Go</title><link>https://tutorialedge.net/golang/validating-http-json-requests/</link><pubDate>Wed, 27 Apr 2022 09:43:40 +0100</pubDate><guid>https://tutorialedge.net/golang/validating-http-json-requests/</guid><description>&lt;p&gt;When choosing your how you wish to expose your Go services, the choice between gRPC and HTTP may be a fairly difficult one. gRPC affords you a more performant network transport, whilst the tooling around it is still behind that of your more standard HTTP-based APIs.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be looking at how we can leverage the &lt;a href="https://github.com/go-playground/validator"
 title="go-playground/validator" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 go-playground/validator&lt;/a&gt; package in order to improve not only the security of our APIs, but also the UX component.&lt;/p&gt;</description></item><item><title>Integration Test - DB</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/071-integration-tests/</link><pubDate>Fri, 08 Apr 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/071-integration-tests/</guid><description/></item><item><title>Testing Overview</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/070-testing-overview/</link><pubDate>Fri, 08 Apr 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/070-testing-overview/</guid><description/></item><item><title>JSON Request Validation</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/067-json-request-validation/</link><pubDate>Sat, 02 Apr 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/067-json-request-validation/</guid><description/></item><item><title>JWT Auth Middleware</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/066-auth-middleware/</link><pubDate>Sat, 02 Apr 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/066-auth-middleware/</guid><description/></item><item><title>Bootstrapping the Transport Layer</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/060-bootstrapping-transport-layer/</link><pubDate>Wed, 16 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/060-bootstrapping-transport-layer/</guid><description/></item><item><title>Graceful Shutdowns</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/061-graceful-shutdowns/</link><pubDate>Wed, 16 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/061-graceful-shutdowns/</guid><description/></item><item><title>Accept Interfaces, Return Structs</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/031-accept-interfaces-return-structs/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/031-accept-interfaces-return-structs/</guid><description/></item><item><title>Application Entrypoint</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/021-application-entrypoint/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/021-application-entrypoint/</guid><description/></item><item><title>Architecture Overview</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/020-architecture-overview/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/020-architecture-overview/</guid><description/></item><item><title>Connecting to our Database</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/050-connecting-to-database/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/050-connecting-to-database/</guid><description/></item><item><title>Context Propagation</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/034-context-propagation/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/034-context-propagation/</guid><description/></item><item><title>Dockerizing our Application</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/040-dockerizating-our-app/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/040-dockerizating-our-app/</guid><description/></item><item><title>Error Handling</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/033-error-handling/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/033-error-handling/</guid><description/></item><item><title>Go REST API V2 - Course Overview</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/001-course-overview/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/001-course-overview/</guid><description/></item><item><title>Go REST API V2 - Project Setup</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/010-project-setup/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/010-project-setup/</guid><description>&lt;p&gt;In this video, we&amp;rsquo;ll be covering how to set up and initialize your project using both the &lt;code&gt;go&lt;/code&gt; CLI as well as the &lt;code&gt;git&lt;/code&gt; CLI.&lt;/p&gt;
&lt;h2 id="initializing-using-go-mod"&gt;
 &lt;a href="#initializing-using-go-mod" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Initializing Using go mod&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by initializing our project using the &lt;code&gt;go mod init&lt;/code&gt; command.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll want to specify the GitHub repo location for our project within the command itself like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go mod init github.com&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;TutorialEdge&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;go&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;rest&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;api&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;course
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, this will create our &lt;code&gt;go.mod&lt;/code&gt; file that is effectively equivalent to the likes of a &lt;code&gt;package.json&lt;/code&gt; file or a &lt;code&gt;requirements.txt&lt;/code&gt; file that you would find in languages like JavaScript and Python.&lt;/p&gt;</description></item><item><title>Implementing Our Endpoints</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/062-defining-our-endpoints/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/062-defining-our-endpoints/</guid><description/></item><item><title>Implementing The Database Package</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/052-implementing-our-db-package/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/052-implementing-our-db-package/</guid><description/></item><item><title>Introducing Taskfiles</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/042-introducing-taskfiles/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/042-introducing-taskfiles/</guid><description/></item><item><title>Running Database Migrations</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/051-running-migrations/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/051-running-migrations/</guid><description/></item><item><title>Running our App with Docker Compose</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/041-docker-compose/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/041-docker-compose/</guid><description/></item><item><title>Service Layer</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/030-service-layer/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/030-service-layer/</guid><description/></item><item><title>Tools Overview</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/011-tools-overview/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/011-tools-overview/</guid><description>&lt;h2 id="installation-instructions"&gt;
 &lt;a href="#installation-instructions" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Installation Instructions&lt;/h2&gt;
&lt;h3 id="docker--docker-compose"&gt;
 &lt;a href="#docker--docker-compose" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Docker &amp;amp; docker-compose&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://docs.docker.com/get-docker/"
 title="https://docs.docker.com/get-docker/" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 https://docs.docker.com/get-docker/&lt;/a&gt;&lt;/p&gt;
&lt;h3 id="taskfiles"&gt;
 &lt;a href="#taskfiles" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Taskfiles&lt;/h3&gt;
&lt;p&gt;&lt;a href="https://taskfile.dev/#/installation"
 title="https://taskfile.dev/#/installation" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 https://taskfile.dev/#/installation&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Versioning our Endpoints</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/063-versioning/</link><pubDate>Sun, 13 Mar 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/063-versioning/</guid><description/></item><item><title>Go Constructors Tutorial</title><link>https://tutorialedge.net/golang/go-constructors-tutorial/</link><pubDate>Fri, 18 Feb 2022 10:51:04 +0000</pubDate><guid>https://tutorialedge.net/golang/go-constructors-tutorial/</guid><description>&lt;p&gt;Welcome Gophers!&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be covering the concept of constructors in Go.&lt;/p&gt;
&lt;h2 id="go-isnt-object-oriented"&gt;
 &lt;a href="#go-isnt-object-oriented" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Go Isn&amp;rsquo;t Object Oriented&lt;/h2&gt;
&lt;p&gt;It&amp;rsquo;s worth pointing out that, Go itself is not an object-oriented language the same way that the likes of Java is. Constructors aren&amp;rsquo;t something that are built in to the language and what I demonstrate below show the equivalents to constructors in Go, but they are more akin to factory functions.&lt;/p&gt;</description></item><item><title>Go REST API V2 - Course Conclusion</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/090-course-conclusion/</link><pubDate>Sun, 06 Feb 2022 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/090-course-conclusion/</guid><description/></item><item><title>Getting Started With Go Generics - Tutorial</title><link>https://tutorialedge.net/golang/getting-starting-with-go-generics/</link><pubDate>Wed, 26 Jan 2022 18:05:36 +0000</pubDate><guid>https://tutorialedge.net/golang/getting-starting-with-go-generics/</guid><description>&lt;p&gt;Generics.&lt;/p&gt;
&lt;p&gt;The addition of generics to the Go language has to be one of the most controversial topics for the Go community.&lt;/p&gt;
&lt;p&gt;Since the start, I&amp;rsquo;ve enjoyed the explicitness of Go and the simplicity that provides for me as a developer. I know, looking at a function signature, exactly what
type I&amp;rsquo;ll be expecting to work with in the body of that function, and I&amp;rsquo;ll generally know what to watch out for.&lt;/p&gt;</description></item><item><title>Go Websocket Tutorial</title><link>https://tutorialedge.net/golang/go-websocket-tutorial/</link><pubDate>Fri, 21 Jan 2022 20:40:33 +0000</pubDate><guid>https://tutorialedge.net/golang/go-websocket-tutorial/</guid><description>&lt;p&gt;Hi Fellow Devs! In this tutorial, we are going to be looking at how we can use WebSockets
within our own Go-based programs to do some cool real-time stuff.&lt;/p&gt;
&lt;p&gt;By the end of this tutorial, we should have covered the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What WebSockets are&lt;/li&gt;
&lt;li&gt;How we can build simple WebSocket Applications in Go&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;For the purpose of this tutorial, we&amp;rsquo;ll be working with the &lt;code&gt;gorilla/websocket&lt;/code&gt; package
as I&amp;rsquo;ve used it personally in a few production applications to great success.&lt;/p&gt;</description></item><item><title>Creating A Dockerfile</title><link>https://tutorialedge.net/courses/docker-for-beginners/03-creating-dockerfile/</link><pubDate>Sun, 09 Jan 2022 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/03-creating-dockerfile/</guid><description>&lt;p&gt;Now that we&amp;rsquo;ve covered the high-level concepts of Docker and containerization as a whole, let&amp;rsquo;s dive into our code editor and start building out our own docker images and containers.&lt;/p&gt;
&lt;h2 id="a-lightweight-dockerfile"&gt;
 &lt;a href="#a-lightweight-dockerfile" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;A Lightweight Dockerfile&lt;/h2&gt;
&lt;p&gt;The first thing we want to do is create our own docker image that we&amp;rsquo;ll later run as a container.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start by creating a file with the name &lt;code&gt;Dockerfile&lt;/code&gt; within our project. We then want to start defining each layer of this Dockerfile.&lt;/p&gt;</description></item><item><title>Docker For Beginners - Course Overview</title><link>https://tutorialedge.net/courses/docker-for-beginners/01-course-overview/</link><pubDate>Sun, 09 Jan 2022 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/01-course-overview/</guid><description>&lt;p&gt;👋 Hey Gophers! In this micro-course, we are going to be covering everything you need in order to get up and running using Docker.&lt;/p&gt;
&lt;h2 id="topics-well-be-covering"&gt;
 &lt;a href="#topics-well-be-covering" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Topics We&amp;rsquo;ll Be Covering&lt;/h2&gt;
&lt;p&gt;My intention for this course is to give you a solid grounding in the fundamentals of Docker. We&amp;rsquo;ll start off building a lightweight Docker image and then look at topics such as how we can run this image as a container.&lt;/p&gt;</description></item><item><title>Docker Overview</title><link>https://tutorialedge.net/courses/docker-for-beginners/02-docker-overview/</link><pubDate>Sun, 09 Jan 2022 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/02-docker-overview/</guid><description>&lt;p&gt;Before we can dive into developing applications that use Docker, it is important to understand the fundamentals of Docker and how it works below the surface.&lt;/p&gt;
&lt;h2 id="high-level-principle"&gt;
 &lt;a href="#high-level-principle" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;High-Level Principle&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Works on my machine&lt;/li&gt;
&lt;li&gt;A means of developers having consistent dev/test/prod environments using containers&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="used-by"&gt;
 &lt;a href="#used-by" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Used By&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A large majority of tech companies.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-you-should-learn-it"&gt;
 &lt;a href="#why-you-should-learn-it" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why You Should Learn It&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;It comes up often in day-to-day development of services when working in Go&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ll tend to find companies use docker-compose to spin up their apps locally and being able to debug issues with startup etc is incredibly important&lt;/li&gt;
&lt;li&gt;The concept of containerization is also incredibly important when it comes to deploying your apps to the likes of a kubernetes cluster.&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Helpful Commands for Docker</title><link>https://tutorialedge.net/courses/docker-for-beginners/04-helpful-commands/</link><pubDate>Sun, 09 Jan 2022 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/04-helpful-commands/</guid><description>&lt;h2 id="working-with-containers"&gt;
 &lt;a href="#working-with-containers" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Working with Containers&lt;/h2&gt;
&lt;h3 id="listing-all-containers"&gt;
 &lt;a href="#listing-all-containers" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Listing All Containers&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; docker ps
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="listing-killed-containers"&gt;
 &lt;a href="#listing-killed-containers" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Listing Killed Containers&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; docker ps &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;a
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="getting-container-logs"&gt;
 &lt;a href="#getting-container-logs" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Getting Container Logs&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; docker logs abc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="stopping-a-container"&gt;
 &lt;a href="#stopping-a-container" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Stopping a Container&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; docker kill abc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="working-with-images"&gt;
 &lt;a href="#working-with-images" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Working with Images&lt;/h2&gt;
&lt;h3 id="listing-all-images"&gt;
 &lt;a href="#listing-all-images" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Listing All Images&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; docker images
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Knowledge Recap Quiz</title><link>https://tutorialedge.net/courses/docker-for-beginners/04-recap-quiz/</link><pubDate>Sun, 09 Jan 2022 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/docker-for-beginners/04-recap-quiz/</guid><description/></item><item><title>🎉 2021 in Review 🎉</title><link>https://tutorialedge.net/blog/2021-in-review/</link><pubDate>Fri, 31 Dec 2021 12:25:45 +0000</pubDate><guid>https://tutorialedge.net/blog/2021-in-review/</guid><description>&lt;p&gt;The past year has been challenging for soo many different reasons both personal and professional, for myself and I&amp;rsquo;m sure for everyone reading this post.&lt;/p&gt;
&lt;p&gt;Whilst things have been challenging, I always enjoy taking a moment at the end of the year to take a step back and recap on the challenges that have been overcome and the progress that has been made.&lt;/p&gt;
&lt;h2 id="the-challenges-"&gt;
 &lt;a href="#the-challenges-" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Challenges 🏋️‍♂️&lt;/h2&gt;
&lt;p&gt;The challenges below represent just &lt;em&gt;some&lt;/em&gt; of the challenges I&amp;rsquo;ve faced over the last year growing TutorialEdge.&lt;/p&gt;</description></item><item><title>Constants in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/22-constants-in-go/</link><pubDate>Tue, 28 Dec 2021 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/22-constants-in-go/</guid><description>&lt;h2 id="transcription"&gt;
 &lt;a href="#transcription" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Transcription&lt;/h2&gt;
&lt;p&gt;In the last video we looked at how we could define some different types of variables. So we looked at, we could define that the string type variable and the integer type variable. In this video, we&amp;rsquo;re going to be looking at a concept known as constant.&lt;/p&gt;
&lt;p&gt;So constants are a little different from variables. They are effectively in-memory locations that cannot be changed throughout the course of our applications execution. This is really useful to us as programmers. Say, for example, you were doing a mathematical application, and you wanted to store the value of pi, for example, then using a constant here makes sense as the value of pi is never going to change no matter what happens within your application.&lt;/p&gt;</description></item><item><title>Creating our First Endpoint</title><link>https://tutorialedge.net/courses/go-serverless-rest-api-course/04-first-endpoint/</link><pubDate>Tue, 28 Dec 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-serverless-rest-api-course/04-first-endpoint/</guid><description>&lt;div class="filename"&gt; cmd/health/main.go &lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/aws/aws-lambda-go/events&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/aws/aws-lambda-go/lambda&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Handler&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;request events&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;APIGatewayV2HTTPRequest&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;events&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;APIGatewayProxyResponse&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; events&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;APIGatewayProxyResponse&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Body&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;I&amp;#39;m Alive&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		StatusCode&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;200&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;},&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	lambda&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Start&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;Handler&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; as sst from &lt;span style="color:#a3be8c"&gt;&amp;#34;@serverless-stack/resources&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;default&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;class&lt;/span&gt; MyStack &lt;span style="color:#81a1c1;font-weight:bold"&gt;extends&lt;/span&gt; sst&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Stack &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; constructor&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;scope&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; id&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; props&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;super&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;scope&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; id&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; props&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// Create a HTTP API
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; api &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;new&lt;/span&gt; sst&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Api&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Api&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; routes&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;GET /api/health&amp;#34;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;cmd/health&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#616e87;font-style:italic"&gt;// Show the endpoint in the output
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;this&lt;/span&gt;&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;addOutputs&lt;span style="color:#eceff4"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;ApiEndpoint&amp;#34;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; api&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;url&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; npx run start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; curl https&lt;span style="color:#81a1c1"&gt;://&lt;/span&gt;&lt;span style="color:#b48ead"&gt;9&lt;/span&gt;d27htf1fk.execute&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;api.us&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;east&lt;span style="color:#b48ead"&gt;-1&lt;/span&gt;.amazonaws.com&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; World&lt;span style="color:#81a1c1"&gt;!&lt;/span&gt; Your request was received at &lt;span style="color:#b48ead"&gt;25&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;Oct&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;17&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;48&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;38&lt;/span&gt; &lt;span style="color:#b48ead"&gt;+0000&lt;/span&gt;.%
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Migrating Our Database and Testing our Endpoints Manually</title><link>https://tutorialedge.net/courses/go-rest-api-course/10-migrating-our-database-and-manual-testing/</link><pubDate>Tue, 28 Dec 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/10-migrating-our-database-and-manual-testing/</guid><description>&lt;h2 id="testing-manually-with-curl"&gt;
 &lt;a href="#testing-manually-with-curl" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Testing Manually with curl&lt;/h2&gt;
&lt;p&gt;In hindsight, when recording this video I assumed viewers would know how to work with Postman which was a mistake. If you aren&amp;rsquo;t familiar with Postman then this section will hopefully highlight an alternative approach to testing your endpoint manually using &lt;code&gt;curl&lt;/code&gt;:&lt;/p&gt;
&lt;h2 id="starting-our-application"&gt;
 &lt;a href="#starting-our-application" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Starting our Application&lt;/h2&gt;
&lt;p&gt;Once we have added the migration code, let&amp;rsquo;s try starting up our application locally:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run cmd&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;server&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting Up Our APP
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting up new database connection
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Setting Up Routes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Perfect, our application is now up and running and ready to go!&lt;/p&gt;</description></item><item><title>Sending HTTP PATCH Requests With curl</title><link>https://tutorialedge.net/snippet/sending-patch-request-with-curl/</link><pubDate>Tue, 14 Dec 2021 11:35:43 +0000</pubDate><guid>https://tutorialedge.net/snippet/sending-patch-request-with-curl/</guid><description>&lt;p&gt;In this snippet, we are going to be taking a look at how we can send &lt;code&gt;HTTP PATCH&lt;/code&gt; requests using the &lt;code&gt;curl&lt;/code&gt;
command line tool.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;PATCH&lt;/code&gt; HTTP verb is used for partial update endpoints. For example, if I just wanted to update a few of the values within an object, I would tend to use a &lt;code&gt;PATCH&lt;/code&gt; request with the ID of the object I wish to update, and the underlying API would then take care of updating these values for me.&lt;/p&gt;</description></item><item><title>Sending HTTP POST Requests With curl</title><link>https://tutorialedge.net/snippet/sending-post-request-with-curl/</link><pubDate>Mon, 13 Dec 2021 11:35:43 +0000</pubDate><guid>https://tutorialedge.net/snippet/sending-post-request-with-curl/</guid><description>&lt;p&gt;In this snippet, we are going to be taking a look at how we can send &lt;code&gt;HTTP POST&lt;/code&gt; requests using the &lt;code&gt;curl&lt;/code&gt;
command line tool. We&amp;rsquo;ll also be looking at how we can specify a request body as well as the &lt;code&gt;Content-Type&lt;/code&gt; headers
that you typically send alongside POST requests.&lt;/p&gt;
&lt;h2 id="sending-a-http-post-request-with-curl"&gt;
 &lt;a href="#sending-a-http-post-request-with-curl" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Sending a HTTP POST Request with Curl&lt;/h2&gt;
&lt;p&gt;The curl tool takes in a flag &lt;code&gt;-X&lt;/code&gt; which allows you to specify the HTTP verb you wish to use for the
request. In this case, we want to specify &lt;code&gt;curl -X POST&lt;/code&gt; to signify this is an &lt;code&gt;HTTP POST&lt;/code&gt; request.&lt;/p&gt;</description></item><item><title>Go Type Assertions Tutorial</title><link>https://tutorialedge.net/golang/go-type-assertions-tutorial/</link><pubDate>Wed, 08 Dec 2021 09:23:04 +0100</pubDate><guid>https://tutorialedge.net/golang/go-type-assertions-tutorial/</guid><description>&lt;p&gt;Welcome Gophers! In this tutorial, we&amp;rsquo;ll be covering the basics of Type Assertions in Go!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Fancy a Challenge?&lt;/strong&gt; - Try your hand at the &lt;a href="https://tutorialedge.net/challenges/go/type-assertions/"
 title="Go Type Assertions Challenge" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Go Type Assertions Challenge&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="type-assertions"&gt;
 &lt;a href="#type-assertions" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Type Assertions&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start by covering the fundamentals. What are type assertions and why are they useful?&lt;/p&gt;
&lt;p&gt;Type assertions provide access to an &lt;a href="./golang/go-interfaces-tutorial/"
 title="interface" 
 &gt;
 interface&lt;/a&gt; value&amp;rsquo;s underlying concrete value.&lt;/p&gt;
&lt;p&gt;Effectively, type assertions allow us to perform basic checks against interfaces to see if their underlying concrete value matches the type we are after. We can use this for all sorts of funky stuff like matching on different error types which we&amp;rsquo;ll see in an example below, or we may just want to double check that an object is what we think it is before proceeding to process it.&lt;/p&gt;</description></item><item><title>Go Context Tutorial</title><link>https://tutorialedge.net/golang/go-context-tutorial/</link><pubDate>Fri, 03 Dec 2021 17:03:11 +0000</pubDate><guid>https://tutorialedge.net/golang/go-context-tutorial/</guid><description>&lt;p&gt;Welcome Gophers! 👋&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be covering contexts in Go and how we can use them within our own Go applications.&lt;/p&gt;
&lt;h2 id="contexts-overview"&gt;
 &lt;a href="#contexts-overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Contexts Overview&lt;/h2&gt;
&lt;p&gt;So first of all, what are contexts?&lt;/p&gt;
&lt;p&gt;I like to imagine contexts almost like a parcel of information that is sent between the various layers of your application. Your parcel is created at the edge of your application - typically when a new API request comes in. This parcel will then be delivered to your service layer and onto your storage layer.&lt;/p&gt;</description></item><item><title>Project Structure Overview</title><link>https://tutorialedge.net/courses/go-serverless-rest-api-course/03-project-structure/</link><pubDate>Sun, 28 Nov 2021 10:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-serverless-rest-api-course/03-project-structure/</guid><description/></item><item><title>Go Serverless REST API - Project Setup</title><link>https://tutorialedge.net/courses/go-serverless-rest-api-course/02-project-setup/</link><pubDate>Sat, 27 Nov 2021 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-serverless-rest-api-course/02-project-setup/</guid><description>&lt;p&gt;In this video, we are going to be laying the foundations for our awesome new serverless application.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be looking at how we can use the &lt;code&gt;npx&lt;/code&gt; command in order to bootstrap our project directory and give us a base which we can build our new empire on.&lt;/p&gt;
&lt;h2 id="bootstrapping-the-project"&gt;
 &lt;a href="#bootstrapping-the-project" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Bootstrapping The Project&lt;/h2&gt;
&lt;p&gt;There are a few things you&amp;rsquo;ll need in order to run the bootstrapping command. Firstly, you are going to need &lt;code&gt;npm&lt;/code&gt; or the Node Package Manager installed on your machine, you&amp;rsquo;ll also need &lt;code&gt;Node&lt;/code&gt; with a version greater than or equal to &lt;code&gt;10.15.1&lt;/code&gt; at the time at which I&amp;rsquo;m writing the script for this video.&lt;/p&gt;</description></item><item><title>Beginner's Guide To Go - Project Setup</title><link>https://tutorialedge.net/courses/go-beginners-guide/51-project-setup/</link><pubDate>Sun, 22 Aug 2021 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/51-project-setup/</guid><description>&lt;p&gt;Every project starts from an empty directory and our&amp;rsquo;s is no different. Let&amp;rsquo;s start off by creating a directory called &lt;code&gt;network-cli&lt;/code&gt; that will house or project.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - You can create this directory anywhere on your local machine. Go &lt;strong&gt;no longer requires&lt;/strong&gt; us to build our projects in specific directories on our machine.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="setting-up-a-github-repo"&gt;
 &lt;a href="#setting-up-a-github-repo" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Setting up a GitHub Repo&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ll need some form of source control management to store the various iterations of our code. For the purpose of this course, I&amp;rsquo;ll be using GitHub to host my project, if you wish to use a different source control management system then feel free to modify the commands to suit your specific system.&lt;/p&gt;</description></item><item><title>Our Application's Entry point</title><link>https://tutorialedge.net/courses/go-beginners-guide/52-starting-command/</link><pubDate>Sun, 22 Aug 2021 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/52-starting-command/</guid><description>&lt;p&gt;In the last video, we looked at setting up our Go project and getting all of the admin out of the way. However, the purpose of this course is to teach Go, so in this video, we&amp;rsquo;ll actually be doing a little bit of programming and creating the entrypoint for our application.&lt;/p&gt;
&lt;h2 id="our-application-entrypoint"&gt;
 &lt;a href="#our-application-entrypoint" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our Application Entrypoint&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s create a new &lt;code&gt;main.go&lt;/code&gt; file. Now this file is going to live under a &lt;code&gt;cmd/cli/&lt;/code&gt; directory. The reason for this is that, when building larger Go projects, you may want to expose your application as a REST API, or as a CLI or as a client app. For each of these examples, we want the entrypoint of our application to live within a dedicated directory under the &lt;code&gt;cmd/&lt;/code&gt; directory.&lt;/p&gt;</description></item><item><title>Packages in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/53-packages-in-go/</link><pubDate>Sun, 22 Aug 2021 10:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/53-packages-in-go/</guid><description>&lt;p&gt;Up until this point, we&amp;rsquo;ve done all of our Go programming within a &lt;code&gt;package main&lt;/code&gt;. This has been purely for educational purposes and also due to the fact that each of the topics we covered didn&amp;rsquo;t warrant splitting out anything into multiple packages.&lt;/p&gt;
&lt;p&gt;Now we&amp;rsquo;ve entered the major leagues though, and we need to start looking at how we can deconstruct our application into a series of modular packages that are easy to test, self-contained and loosely coupled.&lt;/p&gt;</description></item><item><title>Beginner's Project Overview</title><link>https://tutorialedge.net/courses/go-beginners-guide/50-beginners-project/</link><pubDate>Fri, 20 Aug 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/50-beginners-project/</guid><description>&lt;h2 id="project-overview"&gt;
 &lt;a href="#project-overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Project Overview&lt;/h2&gt;
&lt;p&gt;Throughout this project, we are going to gradually introduce more and more advanced topics and build on the fundamentals that we&amp;rsquo;ve learned in previous sections.&lt;/p&gt;
&lt;p&gt;The goal for this section of the course is to build a command-line interface tool (CLI for short) that will&lt;/p&gt;
&lt;h2 id="topics-well-cover"&gt;
 &lt;a href="#topics-well-cover" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Topics We&amp;rsquo;ll Cover&lt;/h2&gt;
&lt;p&gt;Throughout this section of the course, we are going to be covering the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Project Structure&lt;/li&gt;
&lt;li&gt;Packages&lt;/li&gt;
&lt;li&gt;Modules&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Errors in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/41-errors-in-go/</link><pubDate>Fri, 20 Aug 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/41-errors-in-go/</guid><description>&lt;p&gt;Now, if you are used to languages like Java, Python, or PHP, you may be used to the concept of throwing exceptions when parts of your code encounter errors they cannot handle.&lt;/p&gt;
&lt;p&gt;Go is different to these languages as it does not feature exceptions at all. You can certainly use the &lt;code&gt;panic&lt;/code&gt; keyword, however it&amp;rsquo;s recommended to avoid using this for most situations.&lt;/p&gt;
&lt;p&gt;Instead of Panicking, Go developers pass errors as values. Typically, when you call a function it will more often than not return 2 or more values with the last value being an error.&lt;/p&gt;</description></item><item><title>gRPC Overview</title><link>https://tutorialedge.net/courses/go-grpc-services-course/11-grpc-overview/</link><pubDate>Mon, 28 Jun 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/11-grpc-overview/</guid><description/></item><item><title>Protobufs Overview</title><link>https://tutorialedge.net/courses/go-grpc-services-course/08-protobufs-overview/</link><pubDate>Mon, 28 Jun 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/08-protobufs-overview/</guid><description>&lt;p&gt;Before we dive into implementing our proto definitions, let&amp;rsquo;s take a minute to cover what protobufs are and how using them can benefit us as app developers working on distributed systems.&lt;/p&gt;</description></item><item><title>Atomic Counters in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/37-atomic-counters-in-go/</link><pubDate>Thu, 24 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/37-atomic-counters-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at Atomic Counters in Go and what they are used for.&lt;/p&gt;</description></item><item><title>Defer in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/40-defer-in-go/</link><pubDate>Thu, 24 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/40-defer-in-go/</guid><description>&lt;p&gt;We&amp;rsquo;ve had a small glimpse as to what deferred functions are in Go and how they can be used in the previous video. In this video, we are going to be diving deeper and covering the topic more in-depth!&lt;/p&gt;
&lt;h2 id="deferred-functions"&gt;
 &lt;a href="#deferred-functions" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Deferred Functions&lt;/h2&gt;
&lt;p&gt;Deferred functions are something that are used a lot within Go when it comes to things like setting up connections to say, databases, or brokers. Typically we end up using a deferred function to ensure that connections are closed after we are done with them so we don&amp;rsquo;t have stale connections to the database.&lt;/p&gt;</description></item><item><title>Mutexes in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/35-mutexes-in-go/</link><pubDate>Thu, 24 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/35-mutexes-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at Mutexes in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;sync&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Account &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Balance &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Mutex &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;sync&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Mutex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;a &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Account&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Withdraw&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; wg &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;sync&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;WaitGroup&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	a&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Mutex&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Lock&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	a&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Balance &lt;span style="color:#81a1c1"&gt;-=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	a&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Mutex&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Unlock&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	wg&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Done&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;a &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Account&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Deposit&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; wg &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;sync&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;WaitGroup&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	a&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Mutex&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Lock&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	a&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Balance &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	a&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Mutex&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Unlock&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	wg&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Done&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Mutexes in Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; m sync&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Mutex
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	account &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; Account&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Balance&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1000&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Mutex&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;m&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; wg sync&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;WaitGroup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	wg&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Add&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; account&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Withdraw&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;700&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;wg&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; account&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Deposit&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;500&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;wg&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	wg&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Wait&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Account Balances Updated&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;account&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Balance&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Output&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Mutexes &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; Go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Account Balances Updated
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;800&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Panic in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/39-panic-in-go/</link><pubDate>Thu, 24 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/39-panic-in-go/</guid><description>&lt;p&gt;Panic! In the Go program. Not quite as &amp;ldquo;catchy&amp;rdquo; as the band name, but it is however, something you should know about if you are a Go developer!&lt;/p&gt;
&lt;p&gt;In this video, we are going to cover all things Panic and why/when to use them, and more importantly, when not to use them!&lt;/p&gt;
&lt;h2 id="panic"&gt;
 &lt;a href="#panic" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Panic&lt;/h2&gt;
&lt;p&gt;Now, &lt;code&gt;panic&lt;/code&gt; is what is known as a built-in function within Go that can be called anywhere, without the need to import an additional package. It&amp;rsquo;s similar to the &lt;code&gt;println&lt;/code&gt; functions that we&amp;rsquo;ve used in earlier videos in the course in that regard.&lt;/p&gt;</description></item><item><title>Pointers in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/38-pointers-in-go/</link><pubDate>Thu, 24 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/38-pointers-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at pointers in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="code"&gt;
 &lt;a href="#code" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Engineer - stores the name and age of an engineer&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Engineer &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Age &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;UpdateAge&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Age &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;UpdateName&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;new name&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;UpdateAge&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Age &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Go Pointers Tutorial&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	elliot &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;Engineer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Elliot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Age&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;27&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;elliot&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	elliot&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;UpdateAge&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;elliot&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	elliot&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;UpdateName&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;elliot&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#88c0d0"&gt;UpdateAge&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;elliot&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;elliot&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Output&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Go Pointers Tutorial
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Elliot &lt;span style="color:#b48ead"&gt;27&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Elliot &lt;span style="color:#b48ead"&gt;28&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;new name &lt;span style="color:#b48ead"&gt;28&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;new name &lt;span style="color:#b48ead"&gt;28&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;new name &lt;span style="color:#b48ead"&gt;29&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>WaitGroups in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/34-waitgroups-in-go/</link><pubDate>Thu, 24 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/34-waitgroups-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at WaitGroups in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;sync&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; urls &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;https://google.com&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;https://twitter.com&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;https://tutorialedge.net&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;fetch&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;url &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; wg &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;sync&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;WaitGroup&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	resp&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Get&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;url&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;resp&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Status&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	wg&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Done&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;crawl&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; wg sync&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;WaitGroup
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; url &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; urls &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		wg&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Add&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;fetch&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;url&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;wg&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	wg&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Wait&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;finished crawling urls&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#88c0d0"&gt;crawl&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Output&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;200&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;200&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;200&lt;/span&gt; OK
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;finished crawling urls
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>WorkerPools in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/36-workerpools-in-go/</link><pubDate>Thu, 24 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/36-workerpools-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at WorkerPools in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="code"&gt;
 &lt;a href="#code" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Site &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	URL &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Result &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	URL &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Status &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;crawl&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;wId &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; jobs &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt; Site&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; results &lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt; Result&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; site &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; jobs &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Worker ID: %d\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; wId&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		resp&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Get&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;site&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;URL&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;err&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		results &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt; Result&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			URL&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; site&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;URL&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Status&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; resp&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;StatusCode&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;worker pools in Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	jobs &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt; Site&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	results &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt; Result&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; w &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; w &lt;span style="color:#81a1c1"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; w&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;crawl&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; jobs&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; results&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	urls &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a3be8c"&gt;&amp;#34;https://tutorialedge.net&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a3be8c"&gt;&amp;#34;https://tutorialedge.net/pricing/&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a3be8c"&gt;&amp;#34;https://example.com&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a3be8c"&gt;&amp;#34;https://google.com&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; _&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; url &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;range&lt;/span&gt; urls &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		jobs &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt; Site&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;URL&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; url&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1"&gt;close&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;jobs&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; a &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; a &lt;span style="color:#81a1c1"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; a&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		result &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt;results
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;result&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Output&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;worker pools &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; Go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;07&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;14&lt;/span&gt; &lt;span style="color:#b48ead"&gt;09&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;54&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;18&lt;/span&gt; Worker ID&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;07&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;14&lt;/span&gt; &lt;span style="color:#b48ead"&gt;09&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;54&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;18&lt;/span&gt; Worker ID&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;07&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;14&lt;/span&gt; &lt;span style="color:#b48ead"&gt;09&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;54&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;18&lt;/span&gt; Worker ID&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;07&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;14&lt;/span&gt; &lt;span style="color:#b48ead"&gt;09&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;54&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;19&lt;/span&gt; Worker ID&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;07&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;14&lt;/span&gt; &lt;span style="color:#b48ead"&gt;09&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;54&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;19&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;https&lt;span style="color:#81a1c1"&gt;://&lt;/span&gt;tutorialedge.net &lt;span style="color:#b48ead"&gt;200&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;07&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;14&lt;/span&gt; &lt;span style="color:#b48ead"&gt;09&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;54&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;19&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;https&lt;span style="color:#81a1c1"&gt;://&lt;/span&gt;tutorialedge.net&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;pricing&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt; &lt;span style="color:#b48ead"&gt;200&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;07&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;14&lt;/span&gt; &lt;span style="color:#b48ead"&gt;09&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;54&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;19&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;https&lt;span style="color:#81a1c1"&gt;://&lt;/span&gt;example.com &lt;span style="color:#b48ead"&gt;200&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;2021&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;07&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;&lt;span style="color:#b48ead"&gt;14&lt;/span&gt; &lt;span style="color:#b48ead"&gt;09&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;54&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;19&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;https&lt;span style="color:#81a1c1"&gt;://&lt;/span&gt;google.com &lt;span style="color:#b48ead"&gt;200&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Acceptance Testing our gRPC Handlers</title><link>https://tutorialedge.net/courses/go-grpc-services-course/16-acceptance-testing-our-grpc-service/</link><pubDate>Mon, 21 Jun 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/16-acceptance-testing-our-grpc-service/</guid><description>&lt;p&gt;At this point, we have the gRPC service just about ready, we&amp;rsquo;ve validated the service is working as expected, but as we add more functionality to our service, we need to implement some acceptance tests to ensure that we don&amp;rsquo;t see regressions in our system over time.&lt;/p&gt;
&lt;p&gt;In this video, we are going to be looking at implementing the first of our acceptance tests to validate our AddRocket gRPC endpoint!&lt;/p&gt;</description></item><item><title>gRPC Error Handling</title><link>https://tutorialedge.net/courses/go-grpc-services-course/17-error-handling/</link><pubDate>Mon, 21 Jun 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/17-error-handling/</guid><description>&lt;p&gt;In this video, we are going to be looking at the concept of error handling and defining error responses within our gRPC microservice.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll take a look at how we can define errors and the various codes we can return so that we can help our downstream client applications when an error does occur.&lt;/p&gt;
&lt;h2 id="updating-the-addrocket-grpc-handler"&gt;
 &lt;a href="#updating-the-addrocket-grpc-handler" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Updating the AddRocket gRPC Handler&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s add some validation within the AddRocket gRPC handler method that will validate an incoming UUID within the Rocket object:&lt;/p&gt;</description></item><item><title>Buffered Channels in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/33-buffered-channels-in-go/</link><pubDate>Sun, 13 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/33-buffered-channels-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at Buffered Channels in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;math/rand&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CalculateValues&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;values &lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		value &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; rand&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Intn&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Value Calculated: %d\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; value&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		values &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	values &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CalculateValues&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;values&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;for&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i &lt;span style="color:#81a1c1"&gt;&amp;lt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt; i&lt;span style="color:#81a1c1"&gt;++&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		time&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Sleep&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; time&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Second&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		value &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt;values
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Output&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;9&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;8&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;6&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Channels in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/32-channels-in-go/</link><pubDate>Fri, 04 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/32-channels-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at Channels in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;math/rand&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CalculateValue&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;values &lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	value &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; rand&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Intn&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;10&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Value Calculated: %d\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; value&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	values &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt; value
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	values &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;make&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;chan&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;CalculateValue&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;values&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	value &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;lt;-&lt;/span&gt;values
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;value&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Output&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Value Calculated&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Goroutines in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/31-goroutines-in-go/</link><pubDate>Fri, 04 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/31-goroutines-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at goroutines in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;time&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;HelloWorld&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	time&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Sleep&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;1&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; time&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Second&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;hello: %s\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; name&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;go&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;HelloWorld&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Elliot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;I should be printed first&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	time&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Sleep&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt; time&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Second&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Output&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;I should be printed first
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;hello&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; Elliot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Interfaces in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/30-interfaces-in-go/</link><pubDate>Fri, 04 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/30-interfaces-in-go/</guid><description>&lt;p&gt;Welcome all, in this tutorial we are going to be taking a look at interfaces
within the Go programming language.&lt;/p&gt;
&lt;p&gt;By the end of this tutorial, we&amp;rsquo;ll have covered the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The Basics of Interfaces&lt;/li&gt;
&lt;li&gt;Defining Your Own Interfaces&lt;/li&gt;
&lt;li&gt;Pointer Receivers vs Value Receivers&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Awesome, let&amp;rsquo;s dive right in!&lt;/p&gt;
&lt;h2 id="what-is-an-interface"&gt;
 &lt;a href="#what-is-an-interface" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Is An Interface?&lt;/h2&gt;
&lt;p&gt;Before we dive into the code, we need to first take a look at what an interface is and what it provides for us.&lt;/p&gt;</description></item><item><title>Methods in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/29-methods-in-go/</link><pubDate>Fri, 04 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/29-methods-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at structs in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Engineer &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Age &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Project Project
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Project &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Priority &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Technologies &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e Engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Engineer Information&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Name: %s\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Age: %d\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Age&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Current Project: %s\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Project&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;UpdateAge&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Age &lt;span style="color:#81a1c1"&gt;+=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;e &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;GetProjectPriority&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; e&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Project&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Priority
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Methods Tutorial&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	engineer &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; Engineer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Elliot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Age&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;27&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Project&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; Project&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Beginner&amp;#39;s Guide to Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Priority&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;High&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Technologies&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	engineer&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;UpdateAge&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	engineer&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;engineer&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;GetProjectPriority&lt;/span&gt;&lt;span style="color:#eceff4"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Output&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Methods Tutorial
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Engineer Information
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Name&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; Elliot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Age&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;28&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Current Project&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; Beginner&lt;span style="color:#a3be8c"&gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#bf616a"&gt;s Guide to Go&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;High
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Structs in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/28-structs-in-go/</link><pubDate>Fri, 04 Jun 2021 12:00:00 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/28-structs-in-go/</guid><description>&lt;p&gt;In this video, we are going to be looking at structs in Go and what they are used for.&lt;/p&gt;
&lt;h2 id="overview"&gt;
 &lt;a href="#overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Overview&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Engineer &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Age &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Project Project
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Project &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Priority &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Technologies &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Structs Tutorial&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	engineer &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; Engineer&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Elliot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Age&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;27&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Project&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; Project&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Beginner&amp;#39;s Guide to Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Priority&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;High&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Technologies&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;%+v\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; engineer&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;engineer&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Project&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Output&lt;/h4&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Structs Tutorial
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;Elliot Age&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;27&lt;/span&gt; Project&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;Name&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;Beginner&lt;span style="color:#a3be8c"&gt;&amp;#39;s Guide to Go Priority:High Technologies:[Go]}}
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt;Beginner&amp;#39;&lt;/span&gt;s Guide to Go
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Implementing our gRPC Server</title><link>https://tutorialedge.net/courses/go-grpc-services-course/12-implementing-our-grpc-handler/</link><pubDate>Sat, 22 May 2021 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/12-implementing-our-grpc-handler/</guid><description>&lt;p&gt;Now that we have a basic appreciation for why we should use gRPC for our app to app communications, let&amp;rsquo;s now take a look at how we can set about implementing our gRPC server.&lt;/p&gt;
&lt;h2 id="implementing-our-grpc-server"&gt;
 &lt;a href="#implementing-our-grpc-server" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementing our gRPC Server&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s create our &lt;code&gt;transport/grpc&lt;/code&gt; package that is going to house the implementation of our gRPC endpoints as well as the logic to listen and serve on a given port:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; grpc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;net&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;google.golang.org/grpc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// RocketService - defines the rocket service interface&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// which any service passed in to our Handler will need to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// conform to&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; RocketService &lt;span style="color:#81a1c1;font-weight:bold"&gt;interface&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Handler -&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Handler &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	RocketService RocketService
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// New - returns a new gRPC handler&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rktService RocketService&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; Handler &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; Handler&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		RocketService&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; rktService&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Serve - starts out gRPC listeners&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;h Handler&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Serve&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	lis&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; net&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Listen&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;tcp&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;:9000&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fatalf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;failed to listen: %v&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	grpcServer &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; grpc&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;NewServer&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; grpcServer&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Serve&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;lis&lt;span style="color:#eceff4"&gt;);&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fatalf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;failed to serve: %s&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="updating-our-app-setup-code"&gt;
 &lt;a href="#updating-our-app-setup-code" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Updating our App Setup Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/TutorialEdge/go-grpc-services-course/internal/db&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/TutorialEdge/go-grpc-services-course/internal/rocket&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/TutorialEdge/go-grpc-services-course/internal/transport/grpc&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Run - handles the setup and starting of our application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// using this approach makes testing easier and we can more&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// gracefully handle errors&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Run&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Starting up Rocket gRPC Service&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// rktStore - the store responsible for holding&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// our rocket inventory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	rktStore&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; db&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// trigger our migration so that the database we are connecting&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// to has the latest database schema changes&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; rktStore&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Migrate&lt;/span&gt;&lt;span style="color:#eceff4"&gt;();&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// rktService the service responsible for updating our&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// rocket inventory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	rktService &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rktStore&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// rktHandler instantiates a new gRPC handler&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// which we pass our rktService into&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	rktHandler &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; grpc&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rktService&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// Start our gRPC listener, this is a blocking&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// function call so it should be the last thing&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// we run in this function&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; rktHandler&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Serve&lt;/span&gt;&lt;span style="color:#eceff4"&gt;();&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// our main function is super small, only responsible&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// for calling Run and then handling the error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Run&lt;/span&gt;&lt;span style="color:#eceff4"&gt;();&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fatal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;err&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="implementing-the-stub-methods"&gt;
 &lt;a href="#implementing-the-stub-methods" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementing the Stub Methods&lt;/h2&gt;
&lt;p&gt;Now that we have the Serve function up and running, let&amp;rsquo;s have a look at implementing the stub gRPC handler functions for our rocket microservice:&lt;/p&gt;</description></item><item><title>Implementing the AddRocket gRPC Handler</title><link>https://tutorialedge.net/courses/go-grpc-services-course/14-add-rocket-grpc-handler/</link><pubDate>Sat, 22 May 2021 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/14-add-rocket-grpc-handler/</guid><description>&lt;p&gt;In the last video, we made a start at implementing the first of our gRPC handler functions as well as implementing the database functions that back these handlers.&lt;/p&gt;
&lt;p&gt;In this video, we are going to take this a step further and implement the &lt;code&gt;AddRocket&lt;/code&gt; gRPC handler so that we can test adding a Rocket to the database as well as test our previous GetRocket handler.&lt;/p&gt;
&lt;h2 id="our-addrocket-handler"&gt;
 &lt;a href="#our-addrocket-handler" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our AddRocket Handler&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// AddRocket - adds a rocket to the database&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;h Handler&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;AddRocket&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;ctx context&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Context&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; req &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;AddRocketRequest&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;AddRocketResponse&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Add Rocket gRPC endpoint hit&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	newRkt&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; h&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;RocketService&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;InsertRocket&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;ctx&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		ID&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; req&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Id&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Type&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; req&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Type&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; req&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;failed to insert rocket into database&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;AddRocketResponse&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;AddRocketResponse&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Rocket&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Id&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; newRkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;ID&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Type&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; newRkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Type&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; newRkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;},&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="our-db-package-updates"&gt;
 &lt;a href="#our-db-package-updates" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our DB Package Updates:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// InsertRocket - inserts a rocket into the rockets table&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s Store&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;InsertRocket&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rkt rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	_&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; s&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;db&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;NamedQuery&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a3be8c"&gt;`INSERT INTO rockets
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt;		(id, name, type)
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt;		VALUES (:id, :name, :type)`&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		rkt&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; errors&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;failed to insert into database&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		ID&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;ID&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Type&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Type&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Name&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;},&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="testing-with-bloomrpc"&gt;
 &lt;a href="#testing-with-bloomrpc" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Testing with BloomRPC&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s navigate into BloomRPC and import our &lt;code&gt;rocket.proto&lt;/code&gt; file from the Protobuf monorepo and then attempt both an &lt;code&gt;AddRocket&lt;/code&gt; gRPC requests and then, using the ID from the &lt;code&gt;AddRocket&lt;/code&gt; request, let&amp;rsquo;s attempt a &lt;code&gt;GetRocket&lt;/code&gt; gRPC request.&lt;/p&gt;</description></item><item><title>Implementing the DeleteRocket gRPC Handler</title><link>https://tutorialedge.net/courses/go-grpc-services-course/15-delete-rocket-grpc-handler/</link><pubDate>Sat, 22 May 2021 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/15-delete-rocket-grpc-handler/</guid><description>&lt;p&gt;Let&amp;rsquo;s now implement the final gRPC handler function of our Rocket microservice.&lt;/p&gt;
&lt;h2 id="our-deleterocket-handler"&gt;
 &lt;a href="#our-deleterocket-handler" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our DeleteRocket Handler&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// DeleteRocket - handler for deleting a rocket&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;h Handler&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;DeleteRocket&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;ctx context&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Context&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; req &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DeleteRocketRequest&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DeleteRocketResponse&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;delete rocket gRPC endpoint hit&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; h&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;RocketService&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;DeleteRocket&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;ctx&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; req&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Id&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DeleteRocketResponse&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;rkt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DeleteRocketResponse&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Status&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;successfully delete rocket&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;},&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="our-db-package-updates"&gt;
 &lt;a href="#our-db-package-updates" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our DB Package Updates:&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// DeleteRocket - attempts to delete a rocket from the database return err if error&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s Store&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;DeleteRocket&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;id &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	uid&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; uuid&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;FromString&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;id&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	_&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; s&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;db&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Exec&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a3be8c"&gt;`DELETE FROM rockets where id = $1`&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		uid&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="testing-with-bloomrpc"&gt;
 &lt;a href="#testing-with-bloomrpc" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Testing with BloomRPC&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s navigate into BloomRPC and import our &lt;code&gt;rocket.proto&lt;/code&gt; file from the Protobuf monorepo and then attempt both an &lt;code&gt;DeleteRocket&lt;/code&gt; gRPC request using one of the UUID&amp;rsquo;s from a rocket we have previously created.&lt;/p&gt;</description></item><item><title>Implementing the GetRocket gRPC Handler</title><link>https://tutorialedge.net/courses/go-grpc-services-course/13-get-rocket-grpc-handler/</link><pubDate>Sat, 22 May 2021 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/13-get-rocket-grpc-handler/</guid><description>&lt;p&gt;In the last video, we looked at how we could implement the basic gRPC server with stubbed out methods for our handler functions.&lt;/p&gt;
&lt;p&gt;In this video, we are going to be looking at how we can implement the first of our handler functions which will allow us to retrieve a rocket from the database by it&amp;rsquo;s ID.&lt;/p&gt;
&lt;h2 id="updating-our-handlergo"&gt;
 &lt;a href="#updating-our-handlergo" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Updating our Handler.go&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s dive into our &lt;code&gt;handler.go&lt;/code&gt; file and update the &lt;code&gt;GetRocket&lt;/code&gt; handler func:&lt;/p&gt;</description></item><item><title>Installing the Protoc compiler</title><link>https://tutorialedge.net/courses/go-grpc-services-course/09-installing-protoc-compiler/</link><pubDate>Fri, 21 May 2021 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/09-installing-protoc-compiler/</guid><description>&lt;p&gt;Before we dive in to defining and building our protos, we&amp;rsquo;ll first need to ensure that we have the compiler successfully installed on our machine.&lt;/p&gt;
&lt;h2 id="installation"&gt;
 &lt;a href="#installation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Installation&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Full Information can be found here: &lt;a href="https://grpc.io/docs/protoc-installation/"
 title="https://grpc.io/docs/protoc-installation/" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 https://grpc.io/docs/protoc-installation/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="mac-installation-with-homebrew"&gt;
 &lt;a href="#mac-installation-with-homebrew" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Mac Installation with Homebrew&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; brew install protobuf
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; protoc &lt;span style="color:#81a1c1"&gt;--&lt;/span&gt;version
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="linux-installation-with-apt"&gt;
 &lt;a href="#linux-installation-with-apt" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Linux Installation with apt&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; apt install &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;y protobuf&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;compiler
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; protoc &lt;span style="color:#81a1c1"&gt;--&lt;/span&gt;version 
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="windows-installation"&gt;
 &lt;a href="#windows-installation" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Windows installation&lt;/h3&gt;
&lt;p&gt;You can find the latest Windows executable on the releases page of the protocolbuffers/protobuf Github Repository here: &lt;a href="https://github.com/protocolbuffers/protobuf/releases/"
 title="github.com/protocolbuffers/protobuf/releases" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 github.com/protocolbuffers/protobuf/releases&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Setting Up Our Mono-Repo</title><link>https://tutorialedge.net/courses/go-grpc-services-course/10-setting-up-our-monorepo/</link><pubDate>Fri, 21 May 2021 11:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/10-setting-up-our-monorepo/</guid><description>&lt;p&gt;In this video, we are going to look at creating a new repo under which we&amp;rsquo;ll store not only the protos definitions, but also the&lt;/p&gt;
&lt;h2 id="monorepos"&gt;
 &lt;a href="#monorepos" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Monorepos&lt;/h2&gt;
&lt;h2 id="steps"&gt;
 &lt;a href="#steps" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Steps&lt;/h2&gt;
&lt;p&gt;Create a new directory&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; git init
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; gh repo create
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;?&lt;/span&gt; Repository name &lt;span style="color:#81a1c1"&gt;&amp;lt;&lt;/span&gt;USERNAME&lt;span style="color:#81a1c1"&gt;&amp;gt;/&lt;/span&gt;tutorial&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;protos
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;?&lt;/span&gt; Repository description
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;?&lt;/span&gt; Visibility Public
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;?&lt;/span&gt; This will create &lt;span style="color:#a3be8c"&gt;&amp;#39;TutorialEdge/tutorial-protos&amp;#39;&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; your current directory. Continue&lt;span style="color:#81a1c1"&gt;?&lt;/span&gt; Yes
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;✓ Created repository TutorialEdge&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;tutorial&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;protos on GitHub
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;✓ Added remote https&lt;span style="color:#81a1c1"&gt;://&lt;/span&gt;github.com&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;TutorialEdge&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;tutorial&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;protos.git
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="our-makefile"&gt;
 &lt;a href="#our-makefile" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our Makefile&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#88c0d0"&gt;build&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	protoc --go_out&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;plugins&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;grpc:. protos/**/*.proto
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="committing-our-built-protos"&gt;
 &lt;a href="#committing-our-built-protos" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Committing our Built Protos&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; git add &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;A
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; git commit &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;m &lt;span style="color:#a3be8c"&gt;&amp;#34;initial commit&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; git push origin main
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Functions in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/27-functions-in-go/</link><pubDate>Sun, 09 May 2021 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/27-functions-in-go/</guid><description>&lt;h2 id="code"&gt;
 &lt;a href="#code" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;HelloWorld&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; age&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; height &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Hello&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; name&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Age&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; age&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Height:&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; height&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;AddTotal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;a&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; b &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; a &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt; b&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; a &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; b
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Functions in Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#88c0d0"&gt;HelloWorld&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Elliot&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;27&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;200&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	total&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; negativeTotal &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;AddTotal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#b48ead"&gt;2&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#b48ead"&gt;3&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;total&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;negativeTotal&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Output&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Functions &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; Go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello Elliot
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Age &lt;span style="color:#b48ead"&gt;27&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Height&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;200&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#b48ead"&gt;-1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>For Loops in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/26-for-loops-in-go/</link><pubDate>Sat, 08 May 2021 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/26-for-loops-in-go/</guid><description/></item><item><title>Arrays and Slices in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/25-arrays-and-slices-in-go/</link><pubDate>Sat, 08 May 2021 10:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/25-arrays-and-slices-in-go/</guid><description>&lt;h2 id="code"&gt;
 &lt;a href="#code" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Code&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1"&gt;println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Arrays and Slices in Go&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#616e87;font-style:italic"&gt;// [1, 2, 3, 4]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	planets &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;8&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;mercury&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;venus&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;earth&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;mars&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;jupiter&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;saturn&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;uranus&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;nepture&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;planets&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; planetsArray &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;8&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	planetsArray&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;mercury&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;planetsArray&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	planetSlice &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;mercury&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;venus&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;earth&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;mars&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;jupiter&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;saturn&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;uranus&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;nepture&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;planetSlice&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; planetSliceVerbose &lt;span style="color:#eceff4"&gt;[]&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	planetSliceVerbose &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;append&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;planetSliceVerbose&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;mercury&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;planetSliceVerbose&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Output&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; go run main.go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Arrays and Slices &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; Go
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[mercury venus earth mars jupiter saturn uranus nepture]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[mercury ]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[mercury venus earth mars jupiter saturn uranus nepture]
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;[mercury]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>If/Else Statements in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/23-if-else-statements-in-go/</link><pubDate>Fri, 07 May 2021 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/23-if-else-statements-in-go/</guid><description>&lt;p&gt;Welcome Gophers! In this video, we are going to be looking at &lt;code&gt;if/else&lt;/code&gt; statements within the Go programming language!&lt;/p&gt;
&lt;h2 id="example"&gt;
 &lt;a href="#example" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Example&lt;/h2&gt;
&lt;p&gt;Imagine we were building a tool that automatically approved or rejected a customer for a fairground ride depending on their height. We could start off
by defining a &lt;code&gt;customerHeight&lt;/code&gt; int value to store the height in centimeters.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;var&lt;/span&gt; customerHeight &lt;span style="color:#81a1c1"&gt;int&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&lt;/span&gt; &lt;span style="color:#b48ead"&gt;140&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We could then use an &lt;code&gt;if/else&lt;/code&gt; statement in order to decide whether or not this customer can go on the adult rides:&lt;/p&gt;</description></item><item><title>Switch Cases in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/24-switch-statements-in-go/</link><pubDate>Fri, 07 May 2021 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/24-switch-statements-in-go/</guid><description>&lt;h2 id="transcription"&gt;
 &lt;a href="#transcription" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Transcription&lt;/h2&gt;
&lt;p&gt;Now, in the last video, we covered the topic of if statements in go, and we created an application that allows us to check, to see if a customer height or customer age is above a certain amount. In this case, it was 150 or 18, and then they could access all of the rides otherwise, if they were only above the height of 120, then they could access the children&amp;rsquo;s rides.&lt;/p&gt;</description></item><item><title>Variables in Go</title><link>https://tutorialedge.net/courses/go-beginners-guide/21-variables-in-go/</link><pubDate>Fri, 07 May 2021 10:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/21-variables-in-go/</guid><description>&lt;h2 id="transcription"&gt;
 &lt;a href="#transcription" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Transcription&lt;/h2&gt;
&lt;p&gt;Now, in this video, we are going to be covering the topic of variables within go. Now, variables are effectively in-memory storage locations for bits of information that could change throughout the course of our application&amp;rsquo;s execution.&lt;/p&gt;
&lt;p&gt;Now, in go, there are a number of ways to assign or create new variables.&lt;/p&gt;
&lt;p&gt;One of which is to just simply create the name of the variable and then use this &lt;code&gt;:=&lt;/code&gt; syntax here to then instantiate and assign the value of that variable. So in this case, we&amp;rsquo;ll call it Hello world and then if we wanted to use this variable, we could then just replace the hello world string here with the name of the variable that we want to print out.&lt;/p&gt;</description></item><item><title>Writing Your First Go App</title><link>https://tutorialedge.net/courses/go-beginners-guide/12-first-application/</link><pubDate>Thu, 06 May 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/12-first-application/</guid><description>&lt;p&gt;Now that we have Go successfully installed on our machine, Let&amp;rsquo;s try and write our first go application.&lt;/p&gt;
&lt;p&gt;Now I have created the directory under which this application is going to live. I&amp;rsquo;m going to create a new file called &lt;code&gt;main.go&lt;/code&gt; in this directory.&lt;/p&gt;
&lt;p&gt;The first thing I&amp;rsquo;m going to do here is to define a &lt;code&gt;package main&lt;/code&gt; and a &lt;code&gt;func main&lt;/code&gt; I&amp;rsquo;m then going to do &lt;code&gt;println(&amp;quot;Hello World&amp;quot;)&lt;/code&gt; Like so.&lt;/p&gt;</description></item><item><title>Installing Go on your Machine</title><link>https://tutorialedge.net/courses/go-beginners-guide/11-installing-go/</link><pubDate>Thu, 06 May 2021 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/11-installing-go/</guid><description>&lt;p&gt;Now, before we can set off on our quest to learn Go, we will need to install the Go command-line tool on our local machine so that we can effectively transform the code we are going to be writing into the binary executable files that represent our final application.&lt;/p&gt;
&lt;p&gt;These days, the best way to install on your local machine is to navigate to the official Go site &lt;a href="https://golang.org/doc/install"
 title="https://golang.org/doc/install" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 https://golang.org/doc/install&lt;/a&gt; and you should be able to use the installer for your particular operating system and architecture here.&lt;/p&gt;</description></item><item><title>Go Beginner's Guide - Course Overview</title><link>https://tutorialedge.net/courses/go-beginners-guide/01-course-overview/</link><pubDate>Sun, 02 May 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/01-course-overview/</guid><description>&lt;p&gt;Hi Everyone, and welcome to my &lt;strong&gt;Beginner&amp;rsquo;s Guide to Go Course&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Now, in this course, we are going to be covering pretty much everything you need in order to get up and running with the Go programming language.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to be assuming no prior Go knowledge and experience and cover everything in-depth so that you can walk away from this course as a competent and confident Go developer.&lt;/p&gt;
&lt;p&gt;My goal for this course is to give you the learning resource that I personally would have liked when I was first starting out with the Go programming language. I want to go beyond the basic syntax and provide you with that little bit extra so that you can get up to speed quickly and impress your colleagues.&lt;/p&gt;</description></item><item><title>Defining our Protobuf Definitions</title><link>https://tutorialedge.net/courses/go-grpc-services-course/11-defining-our-protos/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/11-defining-our-protos/</guid><description>&lt;p&gt;In the last video, we looked at the advantages of Monorepos containing all of the protobuf definitions in a centralized location so that other services could see the endpoints available when working in distributed systems.&lt;/p&gt;
&lt;p&gt;In this video, we are going to be focused on defining the protos for our service so that we can start the implementation of the transport layer of our microservice.&lt;/p&gt;
&lt;h2 id="defining-our-protos"&gt;
 &lt;a href="#defining-our-protos" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Defining our Protos&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a new file under &lt;code&gt;rocket/v1&lt;/code&gt; called &lt;code&gt;rocket.proto&lt;/code&gt;. This &lt;code&gt;/v1&lt;/code&gt; directory is important as it allows us to effectively version our protobuf definitions and gives us the ability to make breaking changes in say a &lt;code&gt;v2/&lt;/code&gt; or &lt;code&gt;v3/&lt;/code&gt; directory if we need.&lt;/p&gt;</description></item><item><title>Erratum</title><link>https://tutorialedge.net/courses/go-grpc-services-course/21-erratum/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/21-erratum/</guid><description>&lt;h2 id="erratum"&gt;
 &lt;a href="#erratum" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Erratum&lt;/h2&gt;</description></item><item><title>Go gRPC Service - Course Conclusion</title><link>https://tutorialedge.net/courses/go-grpc-services-course/20-course-conclusion/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/20-course-conclusion/</guid><description>&lt;p&gt;Congratulations for completing the course!&lt;/p&gt;
&lt;p&gt;Putting these courses together takes a lot of planning and preparation. Seeing them being put to good use and people completing them makes it all worth it though!&lt;/p&gt;
&lt;h2 id="supporting-the-site"&gt;
 &lt;a href="#supporting-the-site" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Supporting the Site&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;ve enjoyed this course and found real value in it, then please consider sharing this course to your friends/family/colleagues. Every time you share these courses it massively helps the site to grow!&lt;/p&gt;</description></item><item><title>Go gRPC Service - Course Overview</title><link>https://tutorialedge.net/courses/go-grpc-services-course/01-course-overview/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/01-course-overview/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this course, we are going to be covering everything you need to know in order to get up and running building your own gRPC microservices in Go.&lt;/p&gt;
&lt;h2 id="who-am-i"&gt;
 &lt;a href="#who-am-i" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Who Am I?&lt;/h2&gt;
&lt;p&gt;My name is Elliot and I am the creator of TutorialEdge. I&amp;rsquo;ve worked with Go professionally for around 5 years now and in that time I&amp;rsquo;ve been involved in projects like deploying the largest internal private CloudFoundry offering in the world at JPMorgan Chase, as well as more recently helping to develop the next generation of Go services at a startup called Curve.&lt;/p&gt;</description></item><item><title>Go gRPC Service Project Setup</title><link>https://tutorialedge.net/courses/go-grpc-services-course/02-project-setup/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/02-project-setup/</guid><description>&lt;p&gt;Let&amp;rsquo;s kick this course off by creating a new Go project under which we&amp;rsquo;ll be building our gRPC service.&lt;/p&gt;
&lt;h2 id="project-structure"&gt;
 &lt;a href="#project-structure" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Project Structure&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ll want to structure our project in a way that it&amp;rsquo;s easily testible, extendible as well as understandable. We&amp;rsquo;ll start off by creating a &lt;code&gt;cmd&lt;/code&gt; directory which will house the main entry points for our application. Within this directory we&amp;rsquo;ll have a &lt;code&gt;server/&lt;/code&gt; directory and under that our &lt;code&gt;main.go&lt;/code&gt; file.&lt;/p&gt;</description></item><item><title>Implementing the Rocket Service</title><link>https://tutorialedge.net/courses/go-grpc-services-course/03-implementing-rocket-service/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/03-implementing-rocket-service/</guid><description>&lt;p&gt;Before we dive into the wonderful world of gRPC, let&amp;rsquo;s take the time to implement the business critical part of our gRPC service first.&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a &lt;code&gt;rocket.go&lt;/code&gt; file within our &lt;code&gt;internal/rocket/&lt;/code&gt; directory that we created in the last video.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; rocket
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Rocket - should contain things like the ID for the rocket,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// the name for the rocket and the type of rocket. I.e. Falcon Heavy&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Rocket &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	ID &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Name &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	Type &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Service - our rocket service, used for updating our&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// rocket inventory&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Service &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// New - returns a new rocket service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; Service &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; Service&lt;span style="color:#eceff4"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="an-interface-defining-our-store"&gt;
 &lt;a href="#an-interface-defining-our-store" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;An Interface Defining our Store&lt;/h2&gt;
&lt;p&gt;We want to define an &lt;code&gt;interface&lt;/code&gt; that models how we want to store rockets within our database. By defining this here, we effectively enable ourselves to easily swap out our data storage system as long as it adheres to this particular interface.&lt;/p&gt;</description></item><item><title>Migrating our Database</title><link>https://tutorialedge.net/courses/go-grpc-services-course/06-migrating-our-database/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/06-migrating-our-database/</guid><description>&lt;p&gt;Before our app can start up, we need to ensure that the database is set up correctly. This is as true for our local machine setup as it is in production.&lt;/p&gt;
&lt;p&gt;If we need new columns or a different table structure then we need a mechanism that will update our tables prior to our app starting up and serving new requests based on this structure.&lt;/p&gt;
&lt;p&gt;Now, we could log into our Postgres instance and create the tables or make the updates manually, however this gets messy really quickly if we have to manually setup our database on our local machine whenever we want to test.&lt;/p&gt;</description></item><item><title>Running Locally with Docker-compose</title><link>https://tutorialedge.net/courses/go-grpc-services-course/07-running-locally-docker-compose/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/07-running-locally-docker-compose/</guid><description>&lt;h2 id="dockerfile"&gt;
 &lt;a href="#dockerfile" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Dockerfile&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-dockerfile" data-lang="dockerfile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;FROM&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;golang:1.20&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;AS&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;builder&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;RUN&lt;/span&gt; mkdir /app&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;ADD&lt;/span&gt; . /app&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;WORKDIR&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;/app&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;RUN&lt;/span&gt; CGO_ENABLED&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#b48ead"&gt;0&lt;/span&gt; GOOS&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;linux go build -o app cmd/server/main.go&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;FROM&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;alpine:latest&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;AS&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;production&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;COPY&lt;/span&gt; --from&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;builder /app .&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;CMD&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;./app&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#bf616a"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="docker-compose"&gt;
 &lt;a href="#docker-compose" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Docker-compose&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;version&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;3.8&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;services&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;db&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;image&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; postgres:12.2-alpine
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;container_name&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;database&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;ports&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#a3be8c"&gt;&amp;#34;5432:5432&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;environment&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - POSTGRES_DB=postgres
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - POSTGRES_USER=postgres
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - POSTGRES_PASSWORD=postgres
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;networks&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - fullstack
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;volumes&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - database_postgres:/var/lib/postgresql/data
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;api&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;build&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; .
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;container_name&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;grpc-microservice&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;environment&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;DB_USERNAME&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;DB_PASSWORD&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;DB_DB&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;DB_HOST&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;db&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;DB_TABLE&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;DB_PORT&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;5432&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;DB_SSL_MODE&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;disable&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;ports&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - &lt;span style="color:#a3be8c"&gt;&amp;#34;50051:50051&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;depends_on&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;networks&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; - fullstack
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;volumes&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;database_postgres&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;networks&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;fullstack&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;driver&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; bridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="running-our-app"&gt;
 &lt;a href="#running-our-app" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Running Our App&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; docker&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;compose up &lt;span style="color:#81a1c1"&gt;--&lt;/span&gt;build
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>The Database Package</title><link>https://tutorialedge.net/courses/go-grpc-services-course/05-adding-a-database/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/05-adding-a-database/</guid><description>&lt;h2 id="running-postgres-locally-with-docker"&gt;
 &lt;a href="#running-postgres-locally-with-docker" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Running Postgres Locally with Docker&lt;/h2&gt;
&lt;p&gt;Before we set about implementing the database package, we&amp;rsquo;ll need a database running somewhere to connect to and create our tables on. Let&amp;rsquo;s kick off a locally running database using docker:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; docker run &lt;span style="color:#81a1c1"&gt;--&lt;/span&gt;name rocket&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;inventory&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;db &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;e POSTGRES_PASSWORD&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;postgres &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;p &lt;span style="color:#b48ead"&gt;5432&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt;&lt;span style="color:#b48ead"&gt;5432&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;d postgres
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Awesome, if we do &lt;code&gt;docker ps&lt;/code&gt; we should now be able to see our locally running docker container running our Postgres database!&lt;/p&gt;
&lt;h2 id="implementing-our-db-package"&gt;
 &lt;a href="#implementing-our-db-package" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementing our DB package&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; db
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/TutorialEdge/go-grpc-services-course/internal/rocket&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/jmoiron/sqlx&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// DB&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Store &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	db &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;sqlx&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DB
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// New - returns a new Store&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;Store&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	dbUsername &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; os&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Getenv&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;DB_USERNAME&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	dbPassword &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; os&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Getenv&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;DB_PASSWORD&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	dbHost &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; os&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Getenv&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;DB_HOST&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	dbTable &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; os&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Getenv&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;DB_TABLE&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	dbPort &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; os&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Getenv&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;DB_PORT&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	connectString &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Sprintf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;host=%s port=%s user=%s dbname=%s password=%s sslmode=disable&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; dbHost&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; dbPort&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; dbUsername&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; dbTable&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; dbPassword&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	db&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; sqlx&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Connect&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;postgres&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; connectString&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; Store&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; err
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; Store&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		db&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; db&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;},&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// GetRocketByID - returns a rocket from the database by a given ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s Store&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;GetRocketByID&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;id &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// InsertRocket - inserts a new rocket into the database&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s Store&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;InsertRocket&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rkt rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; rocket&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Rocket&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// DeleteRocket - deletes a rocket from the database by it&amp;#39;s ID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;s Store&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;DeleteRocket&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;id &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Awesome, let&amp;rsquo;s now look at how we can instantiate a new Store within the &lt;code&gt;main.go&lt;/code&gt; file and wire this into a Rocket service.&lt;/p&gt;</description></item><item><title>Unit Testing our Rocket Service using Mocks</title><link>https://tutorialedge.net/courses/go-grpc-services-course/04-unit-testing-rocket-service-with-mocks/</link><pubDate>Thu, 22 Apr 2021 19:47:43 +0100</pubDate><guid>https://tutorialedge.net/courses/go-grpc-services-course/04-unit-testing-rocket-service-with-mocks/</guid><description>&lt;p&gt;In the last video, we created our Rocket service which will manage our inventory of rockets by making calls to the backend store. At this point though, we want to start adding some basic unit tests to our application and test that the logic in our Rocket service works as intended.&lt;/p&gt;
&lt;h2 id="installing-mockgen"&gt;
 &lt;a href="#installing-mockgen" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Installing Mockgen&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;ll need to install two dependencies prior to us being able to generate the mocks we need in order to run our test.&lt;/p&gt;</description></item><item><title>Arrays Vs Slices in Go</title><link>https://tutorialedge.net/courses/go-data-structures-course/11-arrays-vs-slices-in-go/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/11-arrays-vs-slices-in-go/</guid><description>&lt;p&gt;👋 Hey Gophers, in this video, we are going to take a quick look at the main differences between an Array in Go and a Slice in Go.&lt;/p&gt;
&lt;h2 id="arrays-vs-slices-in-go"&gt;
 &lt;a href="#arrays-vs-slices-in-go" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Arrays vs Slices in Go&lt;/h2&gt;
&lt;p&gt;The main difference between an Array object in Go and a Slice object is that the Slice is effectively an abstraction built on-top of the Array. They give us programmers a greater degree of flexibility when it comes to working with this particular data structure as they handle things like the automatic resizing of arrays whenever we hit a limit.&lt;/p&gt;</description></item><item><title>Go Serverlesss REST API - Course Overview</title><link>https://tutorialedge.net/courses/go-serverless-rest-api-course/01-course-overview/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-serverless-rest-api-course/01-course-overview/</guid><description>&lt;p&gt;Welcome Gophers! In this course, we are going to be taking a practical approach when it comes to learning how to build REST APIs in Go, using serverless tech.&lt;/p&gt;
&lt;h2 id="serverless-stack"&gt;
 &lt;a href="#serverless-stack" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Serverless-Stack&lt;/h2&gt;
&lt;p&gt;For the purposes of this course, we&amp;rsquo;ll be leveraging the serverless-stack framework in order to quickly build, test, and deploy our serverless applications.&lt;/p&gt;</description></item><item><title>Implementing a Priority Queue in Go</title><link>https://tutorialedge.net/courses/go-data-structures-course/23-implementing-priority-queues-in-go/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/23-implementing-priority-queues-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers, in this tutorial we are going to be looking at how you implement a Priority Queue data structure in Go. We&amp;rsquo;ll be taking what we learned in the previous few videos of this course one step further and updating our &lt;code&gt;Enqueue&lt;/code&gt; and &lt;code&gt;Dequeue&lt;/code&gt; methods so that they follow the Priority Queue specifications!&lt;/p&gt;
&lt;h2 id="implementing-a-priority-queue-in-go"&gt;
 &lt;a href="#implementing-a-priority-queue-in-go" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementing a Priority Queue in Go&lt;/h2&gt;
&lt;p&gt;With the high level overview out of the way, let&amp;rsquo;s look at how we can implement our own version of a Priority Queue in Go:&lt;/p&gt;</description></item><item><title>Implementing a Queue in Go</title><link>https://tutorialedge.net/courses/go-data-structures-course/21-implementing-queues-in-go/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/21-implementing-queues-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this video, we are going to be looking at how you can set about implementing the Queue data structure in Go. We&amp;rsquo;ll cover implementing all of the methods that a basic queue implementation needs.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be building this ourselves, without the help of additional packages or libraries. The focus on this tutorial is how can we effectively implement the Queue data structure and the concepts behind that as opposed to working with Queues for production applications.&lt;/p&gt;</description></item><item><title>Implementing a Set in Go</title><link>https://tutorialedge.net/courses/go-data-structures-course/13-implementing-sets-in-go/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/13-implementing-sets-in-go/</guid><description>&lt;p&gt;👋 Hey Gophers, in this video, we are going to be looking at how we can implement the Set data structure in Go.&lt;/p&gt;
&lt;h2 id="set-implementation"&gt;
 &lt;a href="#set-implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Set Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s kick this off by creating a &lt;code&gt;struct&lt;/code&gt; that we will base our Set implementation on:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; Set &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; Elements &lt;span style="color:#81a1c1;font-weight:bold"&gt;map&lt;/span&gt;&lt;span style="color:#eceff4"&gt;[&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;]&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Given we are working with a &lt;code&gt;map&lt;/code&gt;, we&amp;rsquo;ll have to have a mechanism for instantiating this map. Let&amp;rsquo;s create a &lt;code&gt;New&lt;/code&gt; function now that will return a Set that is ready to use:&lt;/p&gt;</description></item><item><title>Implementing Stacks In Go</title><link>https://tutorialedge.net/courses/go-data-structures-course/31-implementing-stacks-in-go/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/31-implementing-stacks-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers, in this tutorial, we are going to be looking at how we can effectively implement the Stack data structure in Go. We&amp;rsquo;ll look closely at how we can implement the key methods &lt;code&gt;Push&lt;/code&gt;, &lt;code&gt;Pop&lt;/code&gt;, and &lt;code&gt;Peek&lt;/code&gt; as well as the helper methods that give us information such as the size of the stack and if it&amp;rsquo;s empty.&lt;/p&gt;
&lt;h2 id="stack-implementation"&gt;
 &lt;a href="#stack-implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Stack Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s dive in to VS Code and start implementing our Stack data structure.&lt;/p&gt;</description></item><item><title>Onion Architecture 🧅</title><link>https://tutorialedge.net/software-eng/onion-architecture/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/software-eng/onion-architecture/</guid><description>&lt;p&gt;Onions are a delicious vegetable and are a core ingredient in cuisines around the world. Perhaps then you are wondering, why are we discussing them in the context of software engineering? First introduced by &lt;a href="https://jeffreypalermo.com/"
 title="Jeffrey Palermo" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Jeffrey Palermo&lt;/a&gt; in a series of blog posts, Onion Architecture guides software engineers to model their business logic in a &lt;strong&gt;core&lt;/strong&gt; collection with no coupling to the outer concerns, such as database choice or how the user interface operates.&lt;/p&gt;</description></item><item><title>Priority Queues Overview</title><link>https://tutorialedge.net/courses/go-data-structures-course/22-priority-queues/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/22-priority-queues/</guid><description>&lt;p&gt;Let&amp;rsquo;s take what we&amp;rsquo;ve learned about Queues in the previous section one step further and look at how we can implement the concept of priority into these queues.&lt;/p&gt;
&lt;p&gt;Priority queues are similar to the queues you see at the airport where people pay extra so that they can have the luxury of sitting on a plane longer by being boarded first.&lt;/p&gt;
&lt;p&gt;People who pay extra are given a higher priority and are boarded onto the plane first in the order in which they entered the queue. People who refused to pay for such a ridiculous upgrade are onboarded after and have to endure the insides of a plane for less time overall.&lt;/p&gt;</description></item><item><title>Queues Overview</title><link>https://tutorialedge.net/courses/go-data-structures-course/20-queues-overview/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/20-queues-overview/</guid><description>&lt;p&gt;Queues are one of the most widely used data structures, especially when it comes to developing distributed systems. In this video, we are going to look at what queues are and how you can implement a simple implementation of a Queue in Go.&lt;/p&gt;
&lt;h2 id="queues-overview"&gt;
 &lt;a href="#queues-overview" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Queues Overview&lt;/h2&gt;
&lt;p&gt;Queues work on a First-In-First-Out basis. They are software representations of how you would queue at the shops or in line for tickets.&lt;/p&gt;
&lt;Quiz question="Is a Queue A Linear Data Structure?" A="Yes" B="No" correct="A" answer="The correct answer is A - a Queue is considered a linear data structure. Queues, stacks, arrays and linked lists are all examples of linear data structures." /&gt;
&lt;h2 id="conclusion"&gt;
 &lt;a href="#conclusion" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;Awesome, so in this video, we&amp;rsquo;ve covered at a very high level what Queues are and how we can use them to achieve fame and fortune within the programming universe.&lt;/p&gt;</description></item><item><title>Quiz 01 - Beginner's Guide</title><link>https://tutorialedge.net/courses/go-beginners-guide/30-knowledge-check/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/30-knowledge-check/</guid><description/></item><item><title>Quiz 01 - Data Structures</title><link>https://tutorialedge.net/courses/go-data-structures-course/24-beginners-quiz/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/24-beginners-quiz/</guid><description/></item><item><title>Quiz 02 - Beginner's Guide</title><link>https://tutorialedge.net/courses/go-beginners-guide/42-knowledge-check/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-beginners-guide/42-knowledge-check/</guid><description/></item><item><title>Sets Overview</title><link>https://tutorialedge.net/courses/go-data-structures-course/12-sets-overview/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/12-sets-overview/</guid><description>&lt;p&gt;👋 Hey Gophers, in this video, we are going to look at the Set data structure and look at how it works under the covers and how it is useful to us as developers.&lt;/p&gt;
&lt;h2 id="the-set-data-structure"&gt;
 &lt;a href="#the-set-data-structure" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Set Data Structure&lt;/h2&gt;
&lt;p&gt;The Set data structure is somewhat similar to lists or arrays, but it adheres to a couple of constraints.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Uniqueness - The first contraint a Set adheres to is that every element must be unique within the set.&lt;/p&gt;</description></item><item><title>Stacks Overview</title><link>https://tutorialedge.net/courses/go-data-structures-course/30-stacks-overview/</link><pubDate>Fri, 02 Apr 2021 12:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/30-stacks-overview/</guid><description>&lt;p&gt;When it comes to stacks, I always try and picture a stack of pancakes when figuring out how they work.&lt;/p&gt;
&lt;p&gt;They are very similar to Queues except they adhere to the LIFO access pattern - Last In First Out. If you add a pancake to the top of your stack of pancakes, the top pancake is the one you will eat first. The same goes for the stack data structure.&lt;/p&gt;</description></item><item><title>Linked Lists Overview</title><link>https://tutorialedge.net/courses/go-data-structures-course/40-linked-lists-overview/</link><pubDate>Thu, 01 Apr 2021 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/40-linked-lists-overview/</guid><description>&lt;p&gt;I always think that the linked-list data structure sounds a little scarier than the likes of the Queue or Stack. I can admit I struggled with some of the first assignments that we were given in University as I hadn&amp;rsquo;t quite grasped the underlying concepts just yet.&lt;/p&gt;
&lt;p&gt;Hopefully though, in this video we&amp;rsquo;ll demystify what linked lists are and what they can be used for. This should set us up nicely for tackling the implementation of a linked list in the next video!&lt;/p&gt;</description></item><item><title>Basic Auth Middleware</title><link>https://tutorialedge.net/courses/go-rest-api-course/23-basic-auth-middleware/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/23-basic-auth-middleware/</guid><description>&lt;p&gt;In this video, we are going to look at how we can start to tighten up the security of some of our endpoints and ensure that only those with the correct username and password can effectively access some of the endpoints within our app.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s get started by creating this new function:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// BasicAuth - a handy middleware function that logs out incoming requests&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;BasicAuth&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;original &lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;ResponseWriter&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; r &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Request&lt;span style="color:#eceff4"&gt;))&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;ResponseWriter&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; r &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Request&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;ResponseWriter&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; r &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Request&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		user&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; pass&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; ok &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; r&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;BasicAuth&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; user &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;admin&amp;#34;&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&amp;amp;&lt;/span&gt; pass &lt;span style="color:#81a1c1"&gt;==&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;password&amp;#34;&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&amp;amp;&lt;/span&gt; ok &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#88c0d0"&gt;original&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; r&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			w&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Header&lt;/span&gt;&lt;span style="color:#eceff4"&gt;().&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Set&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Content-Type&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;application/json; charset=UTF-8&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#88c0d0"&gt;sendErrorResponse&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;not authorized&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; errors&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;not authorized&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, let&amp;rsquo;s wrap the endpoints we want to protect with this new function:&lt;/p&gt;</description></item><item><title>Course Erratum</title><link>https://tutorialedge.net/courses/go-rest-api-course/30-erratum/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/30-erratum/</guid><description>&lt;p&gt;This article will be updated as and when new issues with the course are brought to my attention or I realise a better way of doing things.&lt;/p&gt;
&lt;h2 id="dependency-inversion-principle"&gt;
 &lt;a href="#dependency-inversion-principle" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Dependency Inversion Principle&lt;/h2&gt;
&lt;p&gt;Whilst the way that I&amp;rsquo;ve implemented the interfaces and their concrete implementations works. One approach that could have improved the design would have been to define the interfaces within the packages that need them and follow the dependency inversion principle.&lt;/p&gt;</description></item><item><title>Defining our K8s Deployment</title><link>https://tutorialedge.net/courses/go-rest-api-course/19-defining-k8s-deployment/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/19-defining-k8s-deployment/</guid><description>&lt;p&gt;Now that we have a kubernetes cluster up and running on our local machine, we can now look at creating a deployment.yaml for our comments API.&lt;/p&gt;
&lt;p&gt;The deployment.yml will effectively contain everything that Kubernetes needs to know in order to run our application within the cluster as a number of pods.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s dive in and start defining this. We&amp;rsquo;ll start off by creating a new directly under which this configuration will live called &lt;code&gt;config&lt;/code&gt; and then we&amp;rsquo;ll create a new &lt;code&gt;deployment.yml&lt;/code&gt; file within this:&lt;/p&gt;</description></item><item><title>Defining our K8s Service</title><link>https://tutorialedge.net/courses/go-rest-api-course/20-defining-k8s-service/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/20-defining-k8s-service/</guid><description>&lt;p&gt;The final piece of the puzzle is to define a k8s service:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;apiVersion&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; v1
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kind&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; Service
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;metadata&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; comments&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;api
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;spec&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; NodePort
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; selector&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; name&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; comments&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;api
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ports&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt; protocol&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; TCP
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; port&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; targetPort&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;8080&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this in place, we can now apply this service using the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;kubectl apply &lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;f config&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;service&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can then set up port-forwarding on our local machine to map &lt;code&gt;localhost:8080&lt;/code&gt; through to the kubernetes service running on port 8080:&lt;/p&gt;</description></item><item><title>Go REST API - Course Conclusion</title><link>https://tutorialedge.net/courses/go-rest-api-course/25-course-conclusion/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/25-course-conclusion/</guid><description>&lt;p&gt;Firstly, I would like to say a massive thanks to everyone who has followed along this course and supported the site! In the first 6 months of writing and delivering courses it&amp;rsquo;s been an absolute joy to see how well received they have been and I&amp;rsquo;m looking forward to delivering a lot more courses in the future.&lt;/p&gt;
&lt;p&gt;Throughout this course, we&amp;rsquo;ve managed to successfully create a well-structured, tested REST API in Go that is ready for production. Hopefully now, you have a strong understanding as to how you can go forth and implement your own services in Go in such a way that they are well structured and easily tested.&lt;/p&gt;</description></item><item><title>Handling Shutdowns Gracefully</title><link>https://tutorialedge.net/courses/go-rest-api-course/41-graceful-shutdown/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/41-graceful-shutdown/</guid><description/></item><item><title>JWT Authentication</title><link>https://tutorialedge.net/courses/go-rest-api-course/24-jwt-authentication/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/24-jwt-authentication/</guid><description>&lt;p&gt;In the last video, we looked at how we could wrap some of our endpoints with basic HTTP authentication. In this video, we are going to take this one step further and look at implementing JWT authentication.&lt;/p&gt;
&lt;p&gt;We are going to be following the same approach that we took in the previous video and creating a decorator function that will effectively act like middleware around the endpoints we want to protect with JWT authentication.&lt;/p&gt;</description></item><item><title>Logging Middleware</title><link>https://tutorialedge.net/courses/go-rest-api-course/22-logging-middleware/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/22-logging-middleware/</guid><description>&lt;p&gt;In the last video, we laid the foundation for improving our application logging. In this video, we&amp;rsquo;ll be expanding upon this to provide more in-depth logging for our application whenever someone hits an endpoint of our app.&lt;/p&gt;
&lt;p&gt;Now, we could, in theory, update the comments package and add logging whenever someone calls a particular function. However, this approach leads to a lot of duplication and we can improve upon this approach by defining a middleware function that we can wrap around all of our endpoints.&lt;/p&gt;</description></item><item><title>Logging with Logrus</title><link>https://tutorialedge.net/courses/go-rest-api-course/21-logging-with-logrus/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/21-logging-with-logrus/</guid><description>&lt;p&gt;Our application is becoming more and more mature with every improvement we make. It&amp;rsquo;s now deployable to a K8s cluster, and it has some acceptance tests in place to ensure it behaves the way we expect when it goes live.&lt;/p&gt;
&lt;p&gt;However, once our system does go live into production, we may have to start looking at the logs and understanding when particular things went wrong.&lt;/p&gt;
&lt;p&gt;It is inevitable that some things will go wrong with our production applications. In order to help our future selves, we need to ensure that we&amp;rsquo;ve done what we can to make investigations as easy as possible. Having structured logging that can then be picked up by something like Datadog is vital in these investigations.&lt;/p&gt;</description></item><item><title>Refactoring Our Interfaces</title><link>https://tutorialedge.net/courses/go-rest-api-course/42-refactoring-our-interfaces/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/42-refactoring-our-interfaces/</guid><description>&lt;p&gt;This article will be updated as and when new issues with the course are brought to my attention or I realise a better way of doing things.&lt;/p&gt;
&lt;h2 id="dependency-inversion-principle"&gt;
 &lt;a href="#dependency-inversion-principle" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Dependency Inversion Principle&lt;/h2&gt;
&lt;p&gt;Whilst the way that I&amp;rsquo;ve implemented the interfaces and their concrete implementations works. One approach that could have improved the design would have been to define the interfaces within the packages that need them and follow the dependency inversion principle.&lt;/p&gt;</description></item><item><title>Running K8s Locally With Kind</title><link>https://tutorialedge.net/courses/go-rest-api-course/18-running-k8s-with-kind/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/18-running-k8s-with-kind/</guid><description>&lt;p&gt;So, before we start defining our Kubernetes deployments and services, we need to have somewhere to actually run these services.&lt;/p&gt;
&lt;p&gt;In the past, this would be the job of minikube, however recently Kind has become the defacto standard for running a k8s cluster locally on your machine for testing purposes.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start by installing this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;brew install kind
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And then once this has been installed successfully, let&amp;rsquo;s create a new cluster:&lt;/p&gt;</description></item><item><title>Setting Sensible Timeouts In Your Server</title><link>https://tutorialedge.net/courses/go-rest-api-course/40-setting-timeouts-server/</link><pubDate>Sun, 28 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/40-setting-timeouts-server/</guid><description>&lt;p&gt;Timeouts within your REST APIs can be an important safety mechanism that helps prevent your server from crashing due to too many long running requests.&lt;/p&gt;
&lt;p&gt;They can also be really helpful in preventing unnecessary resource utilization if you have time-sensitive tasks that must be complete in a certain time window or they fail. At a previous company, we had a 2 second time window in which we had to respond or that particular action would fail, therefore, it made sense to set the timeout to be quite aggressive on this service to prevent some requests lasting longer than the 2 seconds and potentially taking away valuable compute resources away from other incoming requests.&lt;/p&gt;</description></item><item><title>Acceptance Tests with Resty</title><link>https://tutorialedge.net/courses/go-rest-api-course/17-acceptance-test-with-resty/</link><pubDate>Sun, 21 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/17-acceptance-test-with-resty/</guid><description>&lt;p&gt;How can we guarantee our application is working as we intend it to? And how do we ensure that when we are making changes to our application, we aren&amp;rsquo;t somehow breaking other systems that rely upon our service? This is where acceptance tests come in to play.&lt;/p&gt;
&lt;p&gt;Acceptance tests allow us to automatically test our services from the perspective of an upstream client and are a brilliant way to help guard against some potential regressions within our system over time.&lt;/p&gt;</description></item><item><title>Containerizing our Go Apps with Docker</title><link>https://tutorialedge.net/courses/go-rest-api-course/15-containerizing-with-docker/</link><pubDate>Sun, 21 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/15-containerizing-with-docker/</guid><description>&lt;p&gt;In this video, we are going to look at how we can effectively containerize our Go applications using Docker.&lt;/p&gt;</description></item><item><title>Docker-compose for our Go Services</title><link>https://tutorialedge.net/courses/go-rest-api-course/16-docker-compose/</link><pubDate>Sun, 21 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/16-docker-compose/</guid><description>&lt;p&gt;In this video, we are going to take the containerization one step further and define a docker-compose.yml file so that we can easily spin up all of the containers for our REST API.&lt;/p&gt;</description></item><item><title>Handling Errors</title><link>https://tutorialedge.net/courses/go-rest-api-course/12-handling-errors/</link><pubDate>Sat, 13 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/12-handling-errors/</guid><description>&lt;p&gt;Currently, within our API, whenever the comment service responds with an error within our http handler functions it will just return a &lt;code&gt;string&lt;/code&gt; back to the client calling this endpoint.&lt;/p&gt;
&lt;p&gt;As it stands, this is horrible if you are the frontend developer trying to interface with this API endpoint as it gives absolutely no helpful clues as to whether or not the call to this API endpoint has failed.&lt;/p&gt;
&lt;p&gt;In this video, we are going to improve the way our application handles internal errors and the way that it sends these errors back to any client applications.&lt;/p&gt;</description></item><item><title>Acceptance Testing</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/072-acceptance-tests/</link><pubDate>Sat, 06 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/072-acceptance-tests/</guid><description/></item><item><title>Go REST API - Course Overview</title><link>https://tutorialedge.net/courses/go-rest-api-course/01-course-overview/</link><pubDate>Sat, 06 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/01-course-overview/</guid><description>&lt;p&gt;Welcome Gophers! In this course, we are going to be diving into building a production-ready API in Go.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;re going to be deep-diving into concepts such as how you should structure your code to make it readable and testable as well as covering key topics such as interacting with a database, the CI/CD pipeline that we&amp;rsquo;ll be developing with GitHub actions as well as how you can containerize your application and finally deploy it to a kubernetes cluster and having it serving real people.&lt;/p&gt;</description></item><item><title>Go REST API - Project Setup</title><link>https://tutorialedge.net/courses/go-rest-api-course/02-project-setup/</link><pubDate>Sat, 06 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/02-project-setup/</guid><description>&lt;p&gt;We&amp;rsquo;ll start off by creating a simple Go application that will act as the main entrypoint for our REST API.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll also be wanting to initialize our project using the github cli as well:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;$&lt;/span&gt; gh repo create TutorialEdge&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;production&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;ready&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;api
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will provide a series of options that you can choose from. We&amp;rsquo;ll be wanting to create a public repository and you&amp;rsquo;ll want to change TutorialEdge to your own github project.&lt;/p&gt;</description></item><item><title>Implementing Middleware</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/064-implementing-middleware/</link><pubDate>Sat, 06 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/064-implementing-middleware/</guid><description/></item><item><title>Implementing our Database Package - Part 2</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/053-implementing-our-db-package-part-2/</link><pubDate>Sat, 06 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/053-implementing-our-db-package-part-2/</guid><description>&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// UpdateComment - updates a comment in the database&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;d &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Database&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;UpdateComment&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;ctx context&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Context&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; id &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; cmt comment&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Comment&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;comment&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Comment&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	cmtRow &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; CommentRow&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		ID&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; id&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Slug&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; sql&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;NullString&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;String&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; cmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Slug&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; Valid&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Body&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; sql&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;NullString&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;String&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; cmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Body&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; Valid&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Author&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; sql&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;NullString&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;String&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; cmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Author&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; Valid&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;true&lt;/span&gt;&lt;span style="color:#eceff4"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	rows&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; d&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Client&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;NamedQueryContext&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		ctx&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a3be8c"&gt;`UPDATE comments SET
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt;		slug = :slug,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt;		author = :author,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt;		body = :body 
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt;		WHERE id = :id`&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		cmtRow&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; comment&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Comment&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Errorf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;failed to insert comment: %w&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; rows&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Close&lt;/span&gt;&lt;span style="color:#eceff4"&gt;();&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; comment&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Comment&lt;span style="color:#eceff4"&gt;{},&lt;/span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Errorf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;failed to close rows: %w&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;convertCommentRowToComment&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;cmtRow&lt;span style="color:#eceff4"&gt;),&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// DeleteComment - deletes a comment from the database&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;d &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;Database&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;DeleteComment&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;ctx context&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Context&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; id &lt;span style="color:#81a1c1"&gt;string&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	_&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; d&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Client&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;ExecContext&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		ctx&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a3be8c"&gt;`DELETE FROM comments where id = $1`&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		id&lt;span style="color:#eceff4"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Errorf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;failed to delete comment from the database: %w&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Structuring our Application</title><link>https://tutorialedge.net/courses/go-rest-api-course/03-structuring-our-application/</link><pubDate>Sat, 06 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course/03-structuring-our-application/</guid><description>&lt;p&gt;Now that we have a simple app up and running, let&amp;rsquo;s consider how we are going to structure this in such a way that it is easy to do things like mocking when it comes to it and to easily swap in dependencies as we need them.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s start off by updating our &lt;code&gt;main.go&lt;/code&gt; file and create a new app struct:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// App - the struct which contains things like&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// pointers to database connections&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; App &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Run - handles the startup of our application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;app &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;App&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;Run&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;error&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Setting Up Our App&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#616e87;font-style:italic"&gt;// Our main entrypoint for the application&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	app &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; App&lt;span style="color:#eceff4"&gt;{}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; app&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Run&lt;/span&gt;&lt;span style="color:#eceff4"&gt;();&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Error Starting Up&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;err&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now, you may be wondering why we have done it this way? If you are new to Go then the advantages come further down the line when we start to seriously test our application using unit tests, mocks and integration tests to validate that our app works as intended.&lt;/p&gt;</description></item><item><title>Timeout Middleware</title><link>https://tutorialedge.net/courses/go-rest-api-course-v2/065-timeout-middleware/</link><pubDate>Sat, 06 Feb 2021 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-rest-api-course-v2/065-timeout-middleware/</guid><description/></item><item><title>November 2021 in Review</title><link>https://tutorialedge.net/blog/november-2021-in-review/</link><pubDate>Tue, 12 Jan 2021 12:00:07 +0000</pubDate><guid>https://tutorialedge.net/blog/november-2021-in-review/</guid><description>&lt;p&gt;Welcome Gophers! I&amp;rsquo;m going to start posting the monthly reviews on the site alongside my twitter
account for all those interested in seeing the growth of the site over time!&lt;/p&gt;
&lt;p&gt;This is hopefully intended to provide some insight into how things are going and a level of transparency
to people that enjoy following along these things!&lt;/p&gt;
&lt;h2 id="stats"&gt;
 &lt;a href="#stats" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Stats:&lt;/h2&gt;
&lt;p&gt;So far, it&amp;rsquo;s been a fantastic month with a fairly substantial 77 new subscribers for the site and over 150k pageviews!&lt;/p&gt;</description></item><item><title>Benchmarking Your Go Code</title><link>https://tutorialedge.net/courses/go-testing-bible/07-benchmarking-your-code/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/07-benchmarking-your-code/</guid><description>&lt;p&gt;One of the main reasons people tend to use Go is for its performance. It&amp;rsquo;s an incredibly fast compiled and strongly-typed language that is ideal for a large number of use-cases.&lt;/p&gt;
&lt;p&gt;For the large majority of use-cases, performance is often &amp;ldquo;good-enough&amp;rdquo; within your Go applications and you don&amp;rsquo;t tend to often need to go down the route of benchmarking your code and analyzing performance to any great detail.&lt;/p&gt;
&lt;p&gt;There are however, a number of use cases that require absolute peak performance. It is for these use cases that doing some degree of benchmarking your code is incredibly important. You need to be able to understand the performance characteristics and benchmarking is a fantastic way to consistently do that.&lt;/p&gt;</description></item><item><title>Build tags in Go</title><link>https://tutorialedge.net/courses/go-testing-bible/21-build-tags-in-go/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/21-build-tags-in-go/</guid><description>&lt;p&gt;In this video, we are going to look at how you can differentiate different tests within your Go projects using build tags.&lt;/p&gt;</description></item><item><title>E2E Testing Overview</title><link>https://tutorialedge.net/courses/go-testing-bible/23-e2e-testing-overview/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/23-e2e-testing-overview/</guid><description>&lt;p&gt;In this video, we are going to cover a high level overview of End-2-End testing and the various frameworks you can use to tackle this!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/TutorialEdge/go-fiber-rest-api-tutorial"
 title="Link To Repository" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Link To Repository&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Generating Mocks with Mockery</title><link>https://tutorialedge.net/courses/go-testing-bible/13-generating-mocks-mockery/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/13-generating-mocks-mockery/</guid><description>&lt;p&gt;In this video, we are going to look at how you can effectively generate mocks for interfaces using the vektra/mockery package.&lt;/p&gt;</description></item><item><title>Getting Started with Testify</title><link>https://tutorialedge.net/courses/go-testing-bible/10-getting-started-with-testify/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/10-getting-started-with-testify/</guid><description>&lt;p&gt;In this video, we are going to look at how you can quickly get up and running with testify in Go!&lt;/p&gt;</description></item><item><title>Getting Started with TestMain</title><link>https://tutorialedge.net/courses/go-testing-bible/08-getting-started-with-testmain/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/08-getting-started-with-testmain/</guid><description>&lt;p&gt;As your services become more intricate and complex, so too does your test setup and teardown. Thankfully, this is where the &lt;code&gt;TestMain&lt;/code&gt; function can help save the day.&lt;/p&gt;
&lt;p&gt;If you need a particular bit of code to execute once within a given test package then you can utilize the &lt;code&gt;TestMain&lt;/code&gt; function to handle this execution.&lt;/p&gt;
&lt;h2 id="a-simple-implementation"&gt;
 &lt;a href="#a-simple-implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;A Simple Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start off with a simple implementation that will highlight how this works, then when we have the basics down we can build on top of this a little and get a better indication as to how we can use this within our own testing strategies.&lt;/p&gt;</description></item><item><title>Getting Started with Unit Tests in Go</title><link>https://tutorialedge.net/courses/go-testing-bible/02-getting-started-with-tests/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/02-getting-started-with-tests/</guid><description>&lt;p&gt;Welcome Gophers, in this first video of the series, we are going to be covering the basics of getting started testing your Go applications.&lt;/p&gt;
&lt;h2 id="why-do-we-test"&gt;
 &lt;a href="#why-do-we-test" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Do We Test?&lt;/h2&gt;
&lt;p&gt;So, first of all, why do we test our applications? This might seem like a simple question to answer but it&amp;rsquo;s good to reaffirm the exact reasons as to why we test before we go down the wrong path and start developing tests that don&amp;rsquo;t provide us any real value.&lt;/p&gt;</description></item><item><title>Implementing Integration Tests</title><link>https://tutorialedge.net/courses/go-testing-bible/22-implementing-integration-tests/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/22-implementing-integration-tests/</guid><description>&lt;p&gt;In this video, we are going to be implementing a number of integration tests around a simple REST API in Go!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/TutorialEdge/go-fiber-rest-api-tutorial"
 title="Link To Repository" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Link To Repository&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Integration Testing in Go</title><link>https://tutorialedge.net/courses/go-testing-bible/20-integration-testing-overview/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/20-integration-testing-overview/</guid><description>&lt;p&gt;In this video, we are going to give a quick overview of what integration testing is and outline what we will be covering in this section of the course!&lt;/p&gt;</description></item><item><title>Linting and Formatting Your Go Code</title><link>https://tutorialedge.net/courses/go-testing-bible/08-linting-and-formatting/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/08-linting-and-formatting/</guid><description>&lt;p&gt;Linting and formatting are hugely important when it comes to reduces the amount of bugs and standardizing your code to remove any smells.&lt;/p&gt;</description></item><item><title>Mocking Services with Testify Mock</title><link>https://tutorialedge.net/courses/go-testing-bible/12-mocking-services-with-testify/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/12-mocking-services-with-testify/</guid><description>&lt;p&gt;In this video, we are going to look at how you can mock service calls within your unit testing in Go using the testify &lt;code&gt;mock&lt;/code&gt; package.&lt;/p&gt;</description></item><item><title>Table Driven Testing in Go</title><link>https://tutorialedge.net/courses/go-testing-bible/04-table-driven-tests-in-go/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/04-table-driven-tests-in-go/</guid><description>&lt;p&gt;In this tutorial, we are going to be covering table-driven testing in Go. We&amp;rsquo;ll be incorporating what we learned in the previous video about sub-tests and coupling them up with this concept of table-driven testing in order to create a truly powerful method of testing the functionality of our code.&lt;/p&gt;
&lt;p&gt;This approach will allow us to start truly testing the code that we&amp;rsquo;ve written and give us the confidence that it does work as expected. With just a couple modifications to our &lt;code&gt;calculator_test&lt;/code&gt; package, we&amp;rsquo;ll be able to provide a truly comprehensive coverage with our tests and ensure that our code works as intended.&lt;/p&gt;</description></item><item><title>Test Coverage with --cover</title><link>https://tutorialedge.net/courses/go-testing-bible/05-test-coverage-with-cover/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/05-test-coverage-with-cover/</guid><description>&lt;p&gt;Test coverage can be a deceiving metric to make decisions based off. Time and time again I have seen large organizations set arbitrary code coverage mandates that don&amp;rsquo;t necessarily provide them with the value that they are after.&lt;/p&gt;
&lt;p&gt;Saying to all developers within your organization - &amp;ldquo;You need at minimum 90% code coverage on all applications&amp;rdquo; - is a dangerous game that can waste developer time and actually cost you money in the long run.&lt;/p&gt;</description></item><item><title>Testing for Race Conditions with -race</title><link>https://tutorialedge.net/courses/go-testing-bible/14-testing-for-race-conditions/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/14-testing-for-race-conditions/</guid><description>&lt;p&gt;In this video, we are going to look at how you can test for race conditions in your Go code using the -race flag.&lt;/p&gt;</description></item><item><title>Testing your HTTP Services with HTTPTest</title><link>https://tutorialedge.net/courses/go-testing-bible/11-testing-http-with-httptest/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/11-testing-http-with-httptest/</guid><description>&lt;p&gt;In this tutorial, we are going to be looking at how you can test your HTTP services using HTTPTest&lt;/p&gt;</description></item><item><title>Tests and Subtests in Go</title><link>https://tutorialedge.net/courses/go-testing-bible/03-test-and-subtests/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/03-test-and-subtests/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this video, we are going to be looking at how you can effectively write sub-tests in Go!&lt;/p&gt;
&lt;p&gt;In the previous tutorial, we started our journey writing tests in Go and wrote our first 2 unit tests whilst also trying to understand a little better &lt;em&gt;why&lt;/em&gt; we write tests to cover our applications.&lt;/p&gt;
&lt;p&gt;In this section of the course, we&amp;rsquo;re going to take things a little bit further and improve the way we do write our tests by incoporating sub-tests into our Go testing strategy.&lt;/p&gt;</description></item><item><title>The Go Testing Bible - Course Overview</title><link>https://tutorialedge.net/courses/go-testing-bible/01-course-overview/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/01-course-overview/</guid><description>&lt;p&gt;In this series, we are going to be comprehensively looking at how you can test your Go-based applications so that you can ensure your next deployment goes smoothly.&lt;/p&gt;
&lt;p&gt;Tests are a hugely important part of any production-ready service and it’s vital that if you are developing serious applications then you should have a battery of tests covering all of the possible paths that can happen within your code.&lt;/p&gt;
&lt;p&gt;Having these tests in place can help to validate your application will work the way you intend it to when it starts handling requests and serving your users.&lt;/p&gt;</description></item><item><title>The Testdata Directory for Testing</title><link>https://tutorialedge.net/courses/go-testing-bible/06-the-testdata-directory-for-tests/</link><pubDate>Sun, 06 Dec 2020 12:00:00 +0100</pubDate><guid>https://tutorialedge.net/courses/go-testing-bible/06-the-testdata-directory-for-tests/</guid><description>&lt;p&gt;In this video, we&amp;rsquo;re going to be exploring the wonderful world of test fixtures and how you can incorporate them into your Go tests and gain fame and fortune!&lt;/p&gt;
&lt;h2 id="what-are-test-fixtures"&gt;
 &lt;a href="#what-are-test-fixtures" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Are Test Fixtures?&lt;/h2&gt;
&lt;p&gt;This was a new term for me when I started developing Go applications. I wasn&amp;rsquo;t entirely sure what it meant, but on further research it seems that test fixtures are effectively files which store some form of state that we need for our tests to run.&lt;/p&gt;</description></item><item><title>Getting Started With Postgres Data Types</title><link>https://tutorialedge.net/software-eng/getting-started-with-postgres-data-types/</link><pubDate>Fri, 04 Dec 2020 23:53:50 +0000</pubDate><guid>https://tutorialedge.net/software-eng/getting-started-with-postgres-data-types/</guid><description>&lt;h2 id="getting-started-with-postgres-data-types"&gt;
 &lt;a href="#getting-started-with-postgres-data-types" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Getting Started with Postgres Data Types&lt;/h2&gt;
&lt;p&gt;Relational database systems store structured data for use by modern web applications, and structured querying language (SQL) is the language programmers use to store and retrieve data. There are several popular SQL databases used, including MySQL, MariaDB, PostgreSQL, and SQLite. The most popular PostgreSQL (aka Postgres) is an advanced open-source database supported by a large developer community. This article will review the benefit of using different Postgres data types.&lt;/p&gt;</description></item><item><title>Getting Started with Functions in Go for WebAssembly</title><link>https://tutorialedge.net/courses/gowebassembly/06-go-wasm-basic-functions-tutorial/</link><pubDate>Wed, 07 Oct 2020 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/gowebassembly/06-go-wasm-basic-functions-tutorial/</guid><description>&lt;p&gt;Basic DOM manipulation is cool, but let&amp;rsquo;s now have a look at how we can start to define functions in WebAssembly that we can subsequently register and call as typical JavaScript functions.&lt;/p&gt;
&lt;p&gt;Within our &lt;code&gt;main.go&lt;/code&gt; file, let&amp;rsquo;s start defining a new function that we&amp;rsquo;ll want to expose to JavaScript:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-makefile" data-lang="makefile"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;package&lt;/span&gt; &lt;span style="color:#bf616a"&gt;main&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;import&lt;/span&gt; &lt;span style="color:#bf616a"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;syscall/js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;func&lt;/span&gt; &lt;span style="color:#bf616a"&gt;myFunc(this&lt;/span&gt; &lt;span style="color:#bf616a"&gt;js.Value,&lt;/span&gt; &lt;span style="color:#bf616a"&gt;inputs&lt;/span&gt; &lt;span style="color:#bf616a"&gt;[]js.Value)&lt;/span&gt; &lt;span style="color:#bf616a"&gt;interface{}&lt;/span&gt; &lt;span style="color:#bf616a"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#bf616a"&gt;fmt.Println(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;My Func Executed&amp;#34;&lt;/span&gt;&lt;span style="color:#bf616a"&gt;)&lt;/span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#bf616a"&gt;return&lt;/span&gt; &lt;span style="color:#bf616a"&gt;nil&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;func&lt;/span&gt; &lt;span style="color:#bf616a"&gt;main()&lt;/span&gt; &lt;span style="color:#bf616a"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#bf616a"&gt;fmt.Println(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Go WebAssembly Tutorial&amp;#34;&lt;/span&gt;&lt;span style="color:#bf616a"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	document &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; js.Global&lt;span style="color:#81a1c1"&gt;()&lt;/span&gt;.Get&lt;span style="color:#81a1c1"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;document&amp;#34;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	hello :&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; document.Call&lt;span style="color:#81a1c1"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;createElement&amp;#34;&lt;/span&gt;, &lt;span style="color:#a3be8c"&gt;&amp;#34;h1&amp;#34;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	hello.Set&lt;span style="color:#81a1c1"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;innerText&amp;#34;&lt;/span&gt;, &lt;span style="color:#a3be8c"&gt;&amp;#34;Go WebAssembly Course&amp;#34;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	document.Get&lt;span style="color:#81a1c1"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;)&lt;/span&gt;.Call&lt;span style="color:#81a1c1"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;appendChild&amp;#34;&lt;/span&gt;, hello&lt;span style="color:#81a1c1"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#bf616a"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this function now defined, we need to register it. Now, this is where it&amp;rsquo;s slightly more complicated, we need to ensure our Go WebAssembly code doesn&amp;rsquo;t terminate before we get a chance to run any of the functions.&lt;/p&gt;</description></item><item><title>Optimizing WASM File Size using Tinygo</title><link>https://tutorialedge.net/courses/gowebassembly/05-optimizing-wasm-size-tinygo/</link><pubDate>Tue, 22 Sep 2020 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/gowebassembly/05-optimizing-wasm-size-tinygo/</guid><description>&lt;p&gt;One of the most critical things you have to take into consideration when building any production-ready Web application, regardless of what it&amp;rsquo;s developed using is the size of the application that you are serving.&lt;/p&gt;
&lt;p&gt;If we have a look at the size of the WebAssembly files that we&amp;rsquo;ve generated so far with Go, you&amp;rsquo;ll notice that they are quite substantial in size for such simple applications.&lt;/p&gt;
&lt;p&gt;Thankfully, there are ways we can effectively optimize these file sizes through the use of TinyGo!&lt;/p&gt;</description></item><item><title>Basic DOM Manipulation in Go and WebAssembly</title><link>https://tutorialedge.net/courses/gowebassembly/04-basic-dom-manipulation-webassembly-go/</link><pubDate>Fri, 11 Sep 2020 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/gowebassembly/04-basic-dom-manipulation-webassembly-go/</guid><description>&lt;p&gt;Let&amp;rsquo;s take this a step further and try and do some basic DOM-manipulation in our WebAssembly application.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll start off by modifying the &lt;code&gt;main&lt;/code&gt; function and implementing the functionality to append a &lt;code&gt;h1&lt;/code&gt; tag to our &lt;code&gt;body&lt;/code&gt; so that we aren&amp;rsquo;t just rendering a blank page.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;syscall/js&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	js&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Global&lt;/span&gt;&lt;span style="color:#eceff4"&gt;().&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Get&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;document&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	hello &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; document&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Call&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;createElement&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;h1&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	hello&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Set&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;innerText&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Go WebAssembly Course&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	document&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Get&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;body&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;).&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Call&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;appendChild&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; hello&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Awesome, let&amp;rsquo;s re-compile this now using the same go build command as before:&lt;/p&gt;</description></item><item><title>Getting Started with Go and WebAssembly</title><link>https://tutorialedge.net/courses/gowebassembly/02-getting-started-with-go-webassembly/</link><pubDate>Fri, 11 Sep 2020 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/gowebassembly/02-getting-started-with-go-webassembly/</guid><description>&lt;p&gt;Let&amp;rsquo;s dive in and have a look at how we can take a simple Go application and compile it down to a WebAssembly file using the go build command.&lt;/p&gt;
&lt;p&gt;As you can see here, we have a simple &lt;code&gt;hello world&lt;/code&gt; application which will be the starting point for our course.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s open up the terminal and ensure we are in the same directory as our &lt;code&gt;main.go&lt;/code&gt; file and then execute the following:&lt;/p&gt;</description></item><item><title>Go WebAssembly Course Overview</title><link>https://tutorialedge.net/courses/gowebassembly/01-course-overview/</link><pubDate>Fri, 11 Sep 2020 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/gowebassembly/01-course-overview/</guid><description>&lt;p&gt;In this course, we are going to be covering the fundamentals you&amp;rsquo;ll need to know in order to start developing your own WebAssembly applications in Go&lt;/p&gt;
&lt;p&gt;By the end of this course, we will have covered things like compiling your Go code to wasm files as well as how we can optimize for the size of these files. We&amp;rsquo;ll also be covering the fundamentals like DOM-manipulation as well as how you can call out to JavaScript to execute JavaScript functions and access JavaScript variables.&lt;/p&gt;</description></item><item><title>Running your Go WebAssembly App in the Browser</title><link>https://tutorialedge.net/courses/gowebassembly/03-running-go-webassembly-in-browser/</link><pubDate>Fri, 11 Sep 2020 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/gowebassembly/03-running-go-webassembly-in-browser/</guid><description>&lt;p&gt;Now that we have been able to compile our Go application as a WebAssembly file and execute it with node. Let&amp;rsquo;s take it a step further and try running this within a browser.&lt;/p&gt;
&lt;p&gt;Start off by creating a new &lt;code&gt;index.html&lt;/code&gt; file within your project directory and then within here add the following:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;html&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;head&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;meta&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;charset&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;utf-8&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;script&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;src&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;wasm_exec.js&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;script&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;script&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; go &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;new&lt;/span&gt; Go&lt;span style="color:#eceff4"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			WebAssembly&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;instantiateStreaming&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;fetch&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;main.wasm&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;),&lt;/span&gt; go&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;importObject&lt;span style="color:#eceff4"&gt;).&lt;/span&gt;then&lt;span style="color:#eceff4"&gt;((&lt;/span&gt;result&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&amp;gt;&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				go&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;run&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;result&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;instance&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#eceff4"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;script&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;head&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;body&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;body&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;html&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Next, you can try serve this using &lt;code&gt;live-server&lt;/code&gt; which can be installed using &lt;code&gt;npm install -g live-server&lt;/code&gt;&lt;/p&gt;</description></item><item><title>Part 06 - Integration With Auth0</title><link>https://tutorialedge.net/courses/ogimg-dev/frontend-06/</link><pubDate>Wed, 01 Jul 2020 21:12:04 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/frontend-06/</guid><description>&lt;p&gt;In this tutorial, we are going to be implementing Auth0 into our React.js application. This will allow users to sign up and create a profile within our app.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧙 Note -&lt;/strong&gt; you can find the official documentation for setting up an Auth0 account here - &lt;a href="https://auth0.com/docs/quickstart/spa/react/01-login"
 title="Auth0 React Quickstart" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Auth0 React Quickstart&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Part 07 - Persistent Sessions and Improve Styles</title><link>https://tutorialedge.net/courses/ogimg-dev/frontend-07/</link><pubDate>Wed, 01 Jul 2020 21:12:04 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/frontend-07/</guid><description>&lt;p&gt;In this tutorial, we are going to be at how we can improve the design of our profile and menu components and also add persistent state to our app.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;🧙 Note -&lt;/strong&gt; you can find the official documentation for setting up an Auth0 account here - &lt;a href="https://auth0.com/docs/quickstart/spa/react/01-login"
 title="Auth0 React Quickstart" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Auth0 React Quickstart&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</description></item><item><title>Deleting Elements From A Map In Go</title><link>https://tutorialedge.net/golang/snippets/deleting-elements-from-map-go/</link><pubDate>Fri, 19 Jun 2020 21:14:02 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/deleting-elements-from-map-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this snippet, we are going to take a look at how you can delete elements from a &lt;code&gt;map&lt;/code&gt; in Go.&lt;/p&gt;
&lt;p&gt;In order to do this, we are going to use the builtin function &lt;code&gt;delete&lt;/code&gt; in order to remove a &lt;code&gt;key&lt;/code&gt; from our &lt;code&gt;mymap&lt;/code&gt; map.&lt;/p&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you found this snippet useful, you may also enjoy some of the other articles on the site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="./golang/go-maps-tutorial/"
 title="Go Maps Tutorial" 
 &gt;
 Go Maps Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Pretty Printing JSON Structs in Go</title><link>https://tutorialedge.net/golang/snippets/pretty-printing-json-struct-go/</link><pubDate>Wed, 10 Jun 2020 08:36:02 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/pretty-printing-json-struct-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this snippet, we are going to look at how you can pretty-print JSON in Go using the &lt;code&gt;json&lt;/code&gt; package!&lt;/p&gt;
&lt;p&gt;In this example we have a simple struct called &lt;code&gt;Flight&lt;/code&gt; which we want to pretty print the values for.&lt;/p&gt;
&lt;p&gt;We can use the &lt;code&gt;json.MarshalIndent&lt;/code&gt; function which takes in the &lt;code&gt;struct&lt;/code&gt; we want to marshal as well as the &lt;code&gt;prefix&lt;/code&gt; string and the &lt;code&gt;indent&lt;/code&gt; string. In this example we don&amp;rsquo;t use a prefix, but we do set the indent to 2 empty spaces.&lt;/p&gt;</description></item><item><title>Converting Byte Slices to Strings in Go</title><link>https://tutorialedge.net/golang/snippets/convert-byte-array-string-go/</link><pubDate>Wed, 10 Jun 2020 08:30:28 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/convert-byte-array-string-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this snippet, we are going to be looking at how you can convert a &lt;code&gt;byte&lt;/code&gt; slice to a &lt;code&gt;string&lt;/code&gt; in Go!&lt;/p&gt;
&lt;p&gt;In order to achieve the conversion we can use the built-in &lt;code&gt;string&lt;/code&gt; function which takes in a byte slice and returns a string value!&lt;/p&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you found this snippet useful, you may also like some of the other snippets on the site:&lt;/p&gt;</description></item><item><title>GitHub Actions for Go Projects</title><link>https://tutorialedge.net/golang/github-actions-for-go-projects/</link><pubDate>Sun, 07 Jun 2020 10:12:45 +0100</pubDate><guid>https://tutorialedge.net/golang/github-actions-for-go-projects/</guid><description>&lt;p&gt;👋 &lt;strong&gt;Welcome Gophers!&lt;/strong&gt; In this tutorial, we are going to be taking a look at how you can leverage GitHub actions for fame and fortune within your own Go projects!&lt;/p&gt;
&lt;p&gt;Specifically, we are going to be taking a look at how you can build your own GitHub actions by starting off with a &lt;code&gt;&amp;quot;Hello World&amp;quot;&lt;/code&gt; example and then ramping it up to more useful actions such as code linting and test coverage reporting!&lt;/p&gt;</description></item><item><title>Go RabbitMQ Beginners Tutorial</title><link>https://tutorialedge.net/golang/go-rabbitmq-tutorial/</link><pubDate>Mon, 25 May 2020 13:24:10 +0100</pubDate><guid>https://tutorialedge.net/golang/go-rabbitmq-tutorial/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this tutorial, we are going to be looking at how you can build Go applications that interact with a RabbitMQ broker!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be taking a look at how you can stand up a test RabbitMQ instance on your local machine using Docker and then we&amp;rsquo;ll look at how you can connect in to that RabbitMQ instance from your Go app so that you can publish and subscribe to various topics within the broker.&lt;/p&gt;</description></item><item><title>Looping Over Array in Go</title><link>https://tutorialedge.net/golang/snippets/looping-over-array-in-go/</link><pubDate>Wed, 13 May 2020 08:27:56 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/looping-over-array-in-go/</guid><description>&lt;p&gt;In this code snippet, we are going to take a look at how you can quickly iterate over an array of type strings in Go.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll use the &lt;code&gt;range&lt;/code&gt; keyword to allow us to iterate over the &lt;code&gt;scientists&lt;/code&gt; array that we have created. This will return 2 values, the first will be the &lt;code&gt;index&lt;/code&gt;, the second is the value.&lt;/p&gt;
&lt;p&gt;In this instance we ignore the &lt;code&gt;index&lt;/code&gt; returned by utilizing an &lt;code&gt;_&lt;/code&gt; in its place. We then print out the value within the body of our &lt;code&gt;for&lt;/code&gt; loop.&lt;/p&gt;</description></item><item><title>Checking if a string contains a sub-string in Go</title><link>https://tutorialedge.net/golang/snippets/checking-string-contains-substring-go/</link><pubDate>Wed, 13 May 2020 07:46:58 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/checking-string-contains-substring-go/</guid><description>&lt;p&gt;In this snippet, we are going to see how we can test if a string contains another string in Go.&lt;/p&gt;
&lt;p&gt;To do this we&amp;rsquo;ll be using the standard library &lt;code&gt;strings&lt;/code&gt; package as it contains an incredibly handy function &lt;code&gt;Contains&lt;/code&gt; which we can pass 2 arguments into. The first argument is our full string, the second is the string we want to check for.&lt;/p&gt;
&lt;p&gt;In this example, we have our &lt;code&gt;originalString&lt;/code&gt; which we test to see if it contains the string &lt;code&gt;our&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Type Casting an Int to a Float in Go</title><link>https://tutorialedge.net/golang/snippets/type-casting-int-to-float-go/</link><pubDate>Wed, 13 May 2020 07:46:58 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/type-casting-int-to-float-go/</guid><description>&lt;p&gt;In this code snippet, we are going to take a look at how you can convert an &lt;code&gt;int&lt;/code&gt; value in Go to a &lt;code&gt;float64&lt;/code&gt; value.&lt;/p&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;For more in-depth information as to how this works, please check out the following blog posts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="./golang/go-basic-types-tutorial/"
 title="Go Basic Types Tutorial" 
 &gt;
 Go Basic Types Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Type Casting an Interface to a String in Go</title><link>https://tutorialedge.net/golang/snippets/type-casting-interface-to-string-go/</link><pubDate>Wed, 13 May 2020 07:46:58 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/type-casting-interface-to-string-go/</guid><description>&lt;p&gt;In this Code Snippet, we are going to see what it takes to convert an &lt;code&gt;interface{}&lt;/code&gt; to a &lt;code&gt;string&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this code snippet, you may also appreciate some of the other content on my site:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="./golang/go-basic-types-tutorial/"
 title="Go Basic Types Tutorial" 
 &gt;
 Go Basic Types Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Go gRPC Beginners Tutorial</title><link>https://tutorialedge.net/golang/go-grpc-beginners-tutorial/</link><pubDate>Tue, 28 Apr 2020 18:46:18 +0000</pubDate><guid>https://tutorialedge.net/golang/go-grpc-beginners-tutorial/</guid><description>&lt;p&gt;&lt;strong&gt;Welcome fellow Gophers!&lt;/strong&gt; A lot of you have requested that I write a tutorial on the topic of gRPC and how you can write your own gRPC-based systems in Go. So, in this tutorial we&amp;rsquo;ll be diving into the wonderful and exciting world of gRPC and exploring how we can leverage it for fame and fortune!&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be diving in to the theory behind gRPC and why it can be better in some situations when compared to more traditional setups like &lt;code&gt;HTTP REST&lt;/code&gt; APIs.&lt;/p&gt;</description></item><item><title>Building a Basic REST API in Go using Fiber</title><link>https://tutorialedge.net/golang/basic-rest-api-go-fiber/</link><pubDate>Thu, 23 Apr 2020 20:44:34 +0100</pubDate><guid>https://tutorialedge.net/golang/basic-rest-api-go-fiber/</guid><description>&lt;p&gt;&lt;strong&gt;Fiber&lt;/strong&gt; is a new Go-based web framework that exploded onto the scene and generated &lt;strong&gt;a lot&lt;/strong&gt; of interest from the programming community. The repository for the framework has consistently been on the &lt;a href="https://github.com/trending"
 title="GitHub Trending" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 GitHub Trending&lt;/a&gt; page for the Go programming language and as such, I thought I would open up the old VS Code and try my hand at building a simple REST API.&lt;/p&gt;
&lt;p&gt;So, in this tutorial, we&amp;rsquo;ll be covering how you can get started building your own REST API systems in Go using this new Fiber framework!&lt;/p&gt;</description></item><item><title>How To Manipulate csv, xlsx, and json Data in Python Using Pandas</title><link>https://tutorialedge.net/python/csv-xlsx-json-data-python/</link><pubDate>Fri, 17 Apr 2020 00:00:00 +0000</pubDate><guid>https://tutorialedge.net/python/csv-xlsx-json-data-python/</guid><description>&lt;p&gt;Python is one of the best languages for working with large datasets. Data scientists around the world use it for both exploratory and descriptive data projects.&lt;/p&gt;
&lt;p&gt;With that said, Python itself lacks many of the core capabilities that data scientists require. We instead rely on an outside programming library called &lt;a href="https://nickmccullum.com/advanced-python/pandas/"
 title="pandas" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 pandas&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;In this tutorial, I will show you how to manipulate csv, xlsx, and json data in Python using the pandas programming library.&lt;/p&gt;</description></item><item><title>Check String Contains Python</title><link>https://tutorialedge.net/python/snippets/check-string-contains-python/</link><pubDate>Thu, 02 Apr 2020 10:05:15 +0100</pubDate><guid>https://tutorialedge.net/python/snippets/check-string-contains-python/</guid><description>&lt;p&gt;In this code snippet, we are going to look at how you can check if a string exists within a string in Python.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; planets &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;my very excellent mother just served us nine pizzas&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;very&amp;#34;&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; planets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;True&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;venus&amp;#34;&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; planets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;False&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We can then use this in if statements like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;planets &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;my very excellent mother just served us nine pizzas&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;just&amp;#34;&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;in&lt;/span&gt; planets&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1"&gt;print&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Just is in the mnemonic&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Vue.js WebSocket Tutorial</title><link>https://tutorialedge.net/javascript/vuejs/vuejs-websocket-tutorial/</link><pubDate>Tue, 31 Mar 2020 20:16:28 +0100</pubDate><guid>https://tutorialedge.net/javascript/vuejs/vuejs-websocket-tutorial/</guid><description>&lt;p&gt;I love playing with WebSockets, they are a very cool bit of technology that allow for incredibly efficient two-way (duplex) communication over a single long-lived TCP connection.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be exploring the wonderful world of WebSockets and how you can integrate them into your Vue.js applications by building a really simple app that utilizes WebSocket connections.&lt;/p&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;p&gt;If you prefer, this tutorial is available in video format!&lt;/p&gt;</description></item><item><title>Go Swagger Tutorial</title><link>https://tutorialedge.net/golang/go-swagger-tutorial/</link><pubDate>Sun, 01 Mar 2020 14:06:56 +0000</pubDate><guid>https://tutorialedge.net/golang/go-swagger-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to look at how we can integrate Swagger on top of our Go REST APIs!&lt;/p&gt;
&lt;h2 id="what-is-swagger"&gt;
 &lt;a href="#what-is-swagger" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Is Swagger?&lt;/h2&gt;
&lt;p&gt;Swagger (now known as OpenAPI) is an industry-standard tool for documenting and visualizing REST APIs. It automatically generates interactive API documentation that allows developers to explore and test your endpoints directly from a web interface.&lt;/p&gt;
&lt;h2 id="why-use-swaggeropenapi"&gt;
 &lt;a href="#why-use-swaggeropenapi" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Use Swagger/OpenAPI?&lt;/h2&gt;
&lt;p&gt;Using Swagger/OpenAPI provides several key benefits:&lt;/p&gt;</description></item><item><title>Designing a Production Grade REST API</title><link>https://tutorialedge.net/software-eng/designing-a-rest-api/</link><pubDate>Mon, 24 Feb 2020 22:11:32 +0000</pubDate><guid>https://tutorialedge.net/software-eng/designing-a-rest-api/</guid><description>&lt;p&gt;In this article, we are going to transcend the programming language paradigm and look at the more high-level topic that is REST API design fundamentals.&lt;/p&gt;
&lt;p&gt;We are going to take a look at some of the &lt;strong&gt;do&amp;rsquo;s&lt;/strong&gt; and &lt;strong&gt;don&amp;rsquo;ts&lt;/strong&gt; when it comes to designing production-ready services and how we can design our systems so that they can be easily extended, upgraded and maintained without any underlying impact to the people consuming your service.&lt;/p&gt;</description></item><item><title>Vue.js Internationalization - I18n - Basics Tutorial</title><link>https://tutorialedge.net/javascript/vuejs/vuejs-i18n-basics-tutorial/</link><pubDate>Sun, 09 Feb 2020 09:03:59 +0000</pubDate><guid>https://tutorialedge.net/javascript/vuejs/vuejs-i18n-basics-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to look at how you can introduce internationalization into your Vue.js applications using the &lt;code&gt;vue-i18n&lt;/code&gt; library.&lt;/p&gt;
&lt;h2 id="what-is-i18n"&gt;
 &lt;a href="#what-is-i18n" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is i18n?&lt;/h2&gt;
&lt;p&gt;If you are trying to build a global audience for your application then being able to cater for a huge number of different languages within your application is a huge win. Thankfully, &lt;strong&gt;i18n&lt;/strong&gt; makes this a lot easier for us by giving us a standard format for defining translations within our application&amp;rsquo;s codebase which can then be quickly swapped in and out depending on the users preference.&lt;/p&gt;</description></item><item><title>Secure Coding in Go - Input Validation</title><link>https://tutorialedge.net/golang/secure-coding-in-go-input-validation/</link><pubDate>Sun, 02 Feb 2020 12:05:03 +0000</pubDate><guid>https://tutorialedge.net/golang/secure-coding-in-go-input-validation/</guid><description>&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;First of all, I would like to thank Elliot Forbes for the opportunity to collaborate in this space. My name is Abdullah Garcia. I am an experienced security engineer with over ten years of successful design and delivery of high-quality solutions across a broad range of industry sectors; for the curious ones, you can find more details in LinkedIn. I&amp;rsquo;m also a neuroscientist focused on Brain-Computer Interfaces (BCIs) for motor neurorehabilitation combining virtual reality, ML, and prosthetics. Finally, in my spare time, I enjoy landscape/urban/street photography (&lt;a href="https://abdullahgarcia.myportfolio.com"
 title="https://abdullahgarcia.myportfolio.com" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 https://abdullahgarcia.myportfolio.com&lt;/a&gt;), traveling, cooking/baking, and all sort of sports&amp;hellip; among other things.&lt;/p&gt;</description></item><item><title>The System Administrator's Python Cheat-sheet</title><link>https://tutorialedge.net/python/sa-python-cheatsheet/</link><pubDate>Fri, 31 Jan 2020 19:28:15 +0000</pubDate><guid>https://tutorialedge.net/python/sa-python-cheatsheet/</guid><description>&lt;p&gt;For the majority of my development career I have been an application developer, and I thoroughly enjoyed writing applications and not worrying so much about the hardware and networking components upon which my applications sat.&lt;/p&gt;
&lt;p&gt;However, over the past year, I have been thrown into the deep end of a far lower level of software engineering than I was previously used to. I have been working on a fairly substantial project which has brought me down into the mirky depths of network rules and VM management. This typically meant moving away from building larger applications that clients directly interacted with and moving more towards writing scripts and deployment pipelines using Python.&lt;/p&gt;</description></item><item><title>2019 in Review - A Massive Year for TutorialEdge</title><link>https://tutorialedge.net/blog/2019-in-review/</link><pubDate>Thu, 02 Jan 2020 08:03:47 +0000</pubDate><guid>https://tutorialedge.net/blog/2019-in-review/</guid><description>&lt;p&gt;2019 has been an absolutely spectacular year for myself and TutorialEdge. In a professional capacity, I feel that this year has been the most challenging and rewarding year yet. I&amp;rsquo;ve started working in a more dev-ops based role and I&amp;rsquo;ve been able to learn far more about things like low-level networking and the underlying infrastructure upon which our applications live on.&lt;/p&gt;
&lt;h2 id="a-massive-thank-you"&gt;
 &lt;a href="#a-massive-thank-you" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;A Massive Thank You!&lt;/h2&gt;
&lt;p&gt;First of all, I&amp;rsquo;d like to thank each and every person that visited the site and supported me this year through subscribing to my channel or following me on Twitter!&lt;/p&gt;</description></item><item><title>Go Project Structure Best Practices</title><link>https://tutorialedge.net/golang/go-project-structure-best-practices/</link><pubDate>Thu, 05 Dec 2019 21:14:52 +0000</pubDate><guid>https://tutorialedge.net/golang/go-project-structure-best-practices/</guid><description>&lt;blockquote&gt;
&lt;p&gt;My new course - &lt;a href="./courses/go-rest-api-course/"
 title="Building a Production-ready REST API in Go" 
 &gt;
 Building a Production-ready REST API in Go&lt;/a&gt; is currently under construction! If you want to learn how to take the contents of this post 1 step further then subscribe and check it out!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The structure your Go applications should follow is a somewhat contentious subject. Some people are adamant that everyone should follow the well known &lt;a href="https://github.com/golang-standards/project-layout"
 title="golang-standards/project-layout" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 golang-standards/project-layout&lt;/a&gt; structure for absolutely every project.&lt;/p&gt;</description></item><item><title>Go Pointers Tutorial</title><link>https://tutorialedge.net/golang/go-pointers-tutorial/</link><pubDate>Sat, 30 Nov 2019 11:56:56 +0000</pubDate><guid>https://tutorialedge.net/golang/go-pointers-tutorial/</guid><description>&lt;p&gt;Welcome Gophers! In this tutorial, we are going to be covering pointers in Go and how you can use them within your own Go programs. We&amp;rsquo;ll be covering the best practices and we&amp;rsquo;ll be covering some of the most common use-cases for pointers.&lt;/p&gt;
&lt;p&gt;By the end of this tutorial, you will have a solid understanding of pointers and how they can be used.&lt;/p&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In Go, when we call a function and pass in a bunch of arguments to that function, the language creates copies of the arguments which are then used within said function. For example:&lt;/p&gt;</description></item><item><title>Vue.js Change Handler Tutorial</title><link>https://tutorialedge.net/javascript/vuejs/vuejs-change-handler-tutorial/</link><pubDate>Sun, 11 Aug 2019 13:35:05 +0100</pubDate><guid>https://tutorialedge.net/javascript/vuejs/vuejs-change-handler-tutorial/</guid><description>&lt;p&gt;Welcome fellow programmers! In this tutorial, we are going to be looking at how you can effectively watch for changes in your application and trigger functions whenever particular data properties are updated.&lt;/p&gt;
&lt;p&gt;In order to demonstrate this, we&amp;rsquo;ll be creating a simple login form component that will watch for changes to the &lt;code&gt;username&lt;/code&gt; field and perform some validation whenever that username is updated. We&amp;rsquo;ll be triggering some really simple animations in Vue.JS whenever the inputted username meets our validation requirements.&lt;/p&gt;</description></item><item><title>Improving Your Go Development Workflow With Git Hooks</title><link>https://tutorialedge.net/golang/improving-go-workflow-with-git-hooks/</link><pubDate>Fri, 02 Aug 2019 08:05:10 +0100</pubDate><guid>https://tutorialedge.net/golang/improving-go-workflow-with-git-hooks/</guid><description>&lt;p&gt;Git hooks are a powerful way of improving your development workflow without having to remember to run additional scripts or perform additional tasks. In this article, we&amp;rsquo;ll look at how you can define your own simple git hooks within a project repository that automatically perform linting and formatting of your Go code.&lt;/p&gt;
&lt;p&gt;This fairly simple example should give you a flavor of how you can leverage git hooks for your own development needs.&lt;/p&gt;</description></item><item><title>Getting Started with Redis and Go - Tutorial</title><link>https://tutorialedge.net/golang/go-redis-tutorial/</link><pubDate>Sun, 28 Jul 2019 09:44:24 +0100</pubDate><guid>https://tutorialedge.net/golang/go-redis-tutorial/</guid><description>&lt;p&gt;Hi everyone, in this tutorial, we are going to be looking at how you can effectively use Redis as a backend solution for your Go applications.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;
 &lt;a href="#prerequisites" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;If you wish to follow this tutorial on your local machine, you&amp;rsquo;ll need to have the following installed on your machine:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Docker - this will be needed to run a local instance of redis, if you already have a redis service then Docker is not needed.&lt;/li&gt;
&lt;li&gt;Go - hopefully this was obvious?&lt;/li&gt;
&lt;li&gt;A text editor such as Visual Studio Code&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="why-redis"&gt;
 &lt;a href="#why-redis" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Redis?&lt;/h2&gt;
&lt;p&gt;Redis is a fantastic open-source in-memory data structure store which can be used for various purposes such a database for your app, or a caching service or even a message broker.&lt;/p&gt;</description></item><item><title>Checking if a Key Exists in a Map in Go</title><link>https://tutorialedge.net/golang/snippets/check-key-exists-in-map-go/</link><pubDate>Wed, 17 Jul 2019 07:58:40 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/check-key-exists-in-map-go/</guid><description>&lt;p&gt;In this code snippet, we are going to look at how we can check if a key exists within a map in Go. Maps are exceptional when it comes to storing key-value pairs.&lt;/p&gt;
&lt;p&gt;When we store a value in a map, we use a hashing function on the key which ultimately results in us getting an index value. This index value represents where in the underlying array a value can be found given there are no collisions.&lt;/p&gt;</description></item><item><title>Comparing 2 Structs in Go</title><link>https://tutorialedge.net/golang/snippets/comparing-structs-in-go/</link><pubDate>Wed, 17 Jul 2019 07:58:40 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/comparing-structs-in-go/</guid><description>&lt;p&gt;In this code snippet, we are going to look at how you can compare two &lt;code&gt;structs&lt;/code&gt; in Go to see if they are equal.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be creating a simple &lt;code&gt;Developer&lt;/code&gt; struct which will feature a &lt;code&gt;Name&lt;/code&gt; and &lt;code&gt;Age&lt;/code&gt; field.&lt;/p&gt;
&lt;p&gt;In the body of our &lt;code&gt;main&lt;/code&gt; function, we&amp;rsquo;ll define two instances of this &lt;code&gt;struct&lt;/code&gt; called &lt;code&gt;elliot&lt;/code&gt; and &lt;code&gt;elliot2&lt;/code&gt; - not the most imaginative I know&amp;hellip;&lt;/p&gt;
&lt;p&gt;Below this, we&amp;rsquo;ll then use the &lt;code&gt;reflect&lt;/code&gt; package from the Go standard library in order to perform a &lt;code&gt;DeepEqual&lt;/code&gt; comparison.&lt;/p&gt;</description></item><item><title>Parsing Date Strings in Go</title><link>https://tutorialedge.net/golang/snippets/parsing-date-strings-in-go/</link><pubDate>Wed, 17 Jul 2019 07:58:40 +0000</pubDate><guid>https://tutorialedge.net/golang/snippets/parsing-date-strings-in-go/</guid><description>&lt;p&gt;In this code snippet, we are going to look at how you can parse date &amp;amp; time strings in Go using the &lt;code&gt;time&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;In this example, we use the &lt;code&gt;time.Parse&lt;/code&gt; function which takes in the date layout as well as the date string we wish to parse.&lt;/p&gt;
&lt;h2 id="list-of-popular-layouts"&gt;
 &lt;a href="#list-of-popular-layouts" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;List of Popular Layouts&lt;/h2&gt;
&lt;p&gt;Here you&amp;rsquo;ll find a list of the most popular date format layouts that you can use to parse your date strings:&lt;/p&gt;</description></item><item><title>Adding Values to an Array in Go</title><link>https://tutorialedge.net/golang/snippets/adding-values-array-slice-go/</link><pubDate>Mon, 15 Jul 2019 19:30:49 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/adding-values-array-slice-go/</guid><description>&lt;p&gt;In this quick snippet, we are going to look at how you can add values to an array in Go using the &lt;code&gt;append&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;In this example, we define an array of type &lt;code&gt;string&lt;/code&gt; which contains a list of scientists. Below where we create this array we use the &lt;code&gt;append&lt;/code&gt; function to then add &lt;code&gt;Hawkins&lt;/code&gt; to the list of scientists.&lt;/p&gt;
&lt;h2 id="the-append-function"&gt;
 &lt;a href="#the-append-function" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The append Function&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;append&lt;/code&gt; function is a built-in function which appends elements to the end of a slice. It takes care of allocating the underlying arrays should they need to be resized to accommodate any new elements and then returns the new slice.&lt;/p&gt;</description></item><item><title>Concatenate Strings in Go</title><link>https://tutorialedge.net/golang/snippets/concatenate-strings-in-go/</link><pubDate>Mon, 15 Jul 2019 19:30:49 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/concatenate-strings-in-go/</guid><description>&lt;p&gt;👋 Welcome Gophers! In this code snippet, we are going to look at how you can efficiently concatenate strings in Go using the string.Builder type.&lt;/p&gt;
&lt;div class="filename"&gt; $ go run main.go &lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;String Concatenation Tutorial
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Hello World
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading&lt;/h3&gt;
&lt;p&gt;If you enjoyed this really quick and dirty code snippet on string concatenation in Go, you may also like these articles:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="./golang/go-basic-types-tutorial/"
 title="Go Basic Types Tutorial" 
 &gt;
 Go Basic Types Tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="./golang/snippets/comparing-structs-in-go/"
 title="Comparing Structs in Go" 
 &gt;
 Comparing Structs in Go&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>Converting a String to an Int in Go</title><link>https://tutorialedge.net/golang/snippets/converting-string-to-int-go/</link><pubDate>Mon, 15 Jul 2019 19:30:49 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/converting-string-to-int-go/</guid><description>&lt;p&gt;In this code snippet, we are going to look at how you can convert a &lt;code&gt;string&lt;/code&gt; variable to an &lt;code&gt;int&lt;/code&gt; variable in Go using the &lt;code&gt;strconv&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;In this example we define a string &lt;code&gt;myAgeString&lt;/code&gt; which is equal to &lt;code&gt;&amp;quot;26&amp;quot;&lt;/code&gt;. In order to convert this &lt;code&gt;string&lt;/code&gt; value to an &lt;code&gt;int&lt;/code&gt; we will need to call &lt;code&gt;strconv.Atoi()&lt;/code&gt; passing in the &lt;code&gt;myAgeString&lt;/code&gt;. This will return the &lt;code&gt;int&lt;/code&gt; value or an &lt;code&gt;error&lt;/code&gt; which can can capture and handle.&lt;/p&gt;</description></item><item><title>Getting the Size of an Array or Slice in Go</title><link>https://tutorialedge.net/golang/snippets/getting-size-of-array-slice-go/</link><pubDate>Mon, 15 Jul 2019 19:30:49 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/getting-size-of-array-slice-go/</guid><description>&lt;p&gt;In this code snippet, we are going to look at how you can retrieve the length of a type in Go using the &lt;code&gt;len&lt;/code&gt; function.&lt;/p&gt;
&lt;p&gt;In this example, we define an a slice of type &lt;code&gt;string&lt;/code&gt; which contains a number of famous scientists. Below this instantiation, we then call &lt;code&gt;len(scientists)&lt;/code&gt; to retrieve the length of this slice which is then printed out for us.&lt;/p&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading:&lt;/h3&gt;
&lt;p&gt;If you enjoyed this code snippet, you may appreciate some of the other content on the site:&lt;/p&gt;</description></item><item><title>Sort Map by Value</title><link>https://tutorialedge.net/golang/snippets/sort-map-by-value/</link><pubDate>Mon, 15 Jul 2019 19:30:49 +0100</pubDate><guid>https://tutorialedge.net/golang/snippets/sort-map-by-value/</guid><description>&lt;blockquote&gt;
&lt;p&gt;In this code snippet, we are going to look at how you can quickly and easily sort maps in Go using the &lt;code&gt;sort&lt;/code&gt; package.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;When we run this, we should see that we are able to retrieve the values from our map in
order of the length of the string key.&lt;/p&gt;
&lt;div class="filename"&gt; $ go run main.go &lt;/div&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Elliot &lt;span style="color:#b48ead"&gt;25&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Fraser &lt;span style="color:#b48ead"&gt;20&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Sophie &lt;span style="color:#b48ead"&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;!-- ## Sort Map by Integer Value

```go
mymap := map[string]int{"Elliot": 25, "Sophie": 24, "Fraser": 20}

```

&lt;div class="filename"&gt; $ output &lt;/div&gt;

```s 

``` --&gt;
&lt;h3 id="further-reading"&gt;
 &lt;a href="#further-reading" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Further Reading&lt;/h3&gt;
&lt;p&gt;If you enjoyed this code snippet, you may also enjoy these articles:&lt;/p&gt;</description></item><item><title>Go Sorting With the sort Package - Tutorial</title><link>https://tutorialedge.net/golang/go-sorting-with-sort-tutorial/</link><pubDate>Sun, 26 May 2019 07:49:44 +0000</pubDate><guid>https://tutorialedge.net/golang/go-sorting-with-sort-tutorial/</guid><description>&lt;p&gt;Sorting items to be in order is something that every programmer will undoubtedly have to do at one point in their career. There are different approaches and many different sorting algorithms available for you to choose from, but typically it is better to rely on already implemented packages to do your sorting for you.&lt;/p&gt;
&lt;h2 id="goals"&gt;
 &lt;a href="#goals" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Goals&lt;/h2&gt;
&lt;p&gt;By the end of this tutorial, you will know how to:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Implement basic sorting within your Go applications using the &lt;code&gt;&amp;quot;sort&amp;quot;&lt;/code&gt; package.&lt;/li&gt;
&lt;li&gt;Implement custom sorting functions that allow you to sort composite data structures&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="prerequisites"&gt;
 &lt;a href="#prerequisites" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;In order to complete this tutorial, you will need the following:&lt;/p&gt;</description></item><item><title>NodeJS JWT Authentication Tutorial</title><link>https://tutorialedge.net/nodejs/nodejs-jwt-authentication-tutorial/</link><pubDate>Sat, 25 May 2019 14:08:54 +0000</pubDate><guid>https://tutorialedge.net/nodejs/nodejs-jwt-authentication-tutorial/</guid><description>&lt;p&gt;Welcome fellow programmers! In this tutorial, we are going to be looking at how we can add authentication to our NodeJS applications using JWTs.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be creating a REST API that feature a mixture of authenticated and un-authenticated JSON endpoints and we&amp;rsquo;ll be implementing a nice and simple JWT validation function that will verify incoming requests to ensure they have the appropriate authorization header set and that the value of that header is a verified JSON Web Token!&lt;/p&gt;</description></item><item><title>Go Tickers Tutorial</title><link>https://tutorialedge.net/golang/go-ticker-tutorial/</link><pubDate>Thu, 02 May 2019 08:00:17 +0000</pubDate><guid>https://tutorialedge.net/golang/go-ticker-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to be looking at tickers in Go and how you can use tickers effectively within your own Go applications.&lt;/p&gt;
&lt;p&gt;Tickers are exceptionally helpful when you need to perform an action repeatedly at given time intervals and we can use tickers, in combination with goroutines in order to run these tasks in the background of our applications.&lt;/p&gt;
&lt;h2 id="tickers-vs-timers"&gt;
 &lt;a href="#tickers-vs-timers" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Tickers vs Timers&lt;/h2&gt;
&lt;p&gt;Before we dive in, it&amp;rsquo;s useful to know the distinction between both &lt;code&gt;tickers&lt;/code&gt; and &lt;code&gt;timers&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Go Modules Tutorial</title><link>https://tutorialedge.net/golang/go-modules-tutorial/</link><pubDate>Fri, 19 Apr 2019 08:34:10 +0000</pubDate><guid>https://tutorialedge.net/golang/go-modules-tutorial/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, we are going to be looking at how you can use Go modules&lt;/strong&gt; in your Go applications
to simplify the way you work with dependencies for your Go applications. We will be looking at
how Go Modules work, and also what problems they solve for us, before finally going into developing a simple
Go application which uses Go Modules.&lt;/p&gt;
&lt;h2 id="goals"&gt;
 &lt;a href="#goals" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Goals&lt;/h2&gt;
&lt;p&gt;By the end of this tutorial:&lt;/p&gt;</description></item><item><title>Go Multi-Stage Docker Tutorial</title><link>https://tutorialedge.net/golang/go-multi-stage-docker-tutorial/</link><pubDate>Sat, 16 Mar 2019 11:16:25 +0000</pubDate><guid>https://tutorialedge.net/golang/go-multi-stage-docker-tutorial/</guid><description>&lt;p&gt;Welcome fellow coders! In this tutorial, we are going to be looking at multi-stage
Docker images and how you can use them to minimize the size of the container needed for
your production Go applications.&lt;/p&gt;
&lt;p&gt;By the end of this tutorial, we will have covered the following concepts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What Multi-stage Dockerfiles are.&lt;/li&gt;
&lt;li&gt;How we can build simple multi-stage Dockerfiles for our Go Apps&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Docker is a seriously powerful containerization technology that can be used to easily spin up
isolated and reproducible environments in which our applications can be built and run.
It&amp;rsquo;s growing in popularity and more and more cloud service providers are providing native
docker support to allow you to easily deploy your containerized apps for the world to see!&lt;/p&gt;</description></item><item><title>Containerizing your Go Applications with Docker - Tutorial</title><link>https://tutorialedge.net/golang/go-docker-tutorial/</link><pubDate>Sat, 02 Mar 2019 22:36:27 +0000</pubDate><guid>https://tutorialedge.net/golang/go-docker-tutorial/</guid><description>&lt;p&gt;Docker is a truly excellent bit of tech that allows us to specify the environment in which we want all of our applications to live within a simple &lt;code&gt;Dockerfile&lt;/code&gt;. This effectively allows for easier collaboration and rids us of the &lt;em&gt;&amp;ldquo;it works on my machine&amp;rdquo;&lt;/em&gt; problem that is so prevalent in development teams across the globe.&lt;/p&gt;
&lt;p&gt;As such, I felt it would be a great idea to write a tutorial on how you can effectively containerize your Go applications using the Docker containerization technology.&lt;/p&gt;</description></item><item><title>My Hardware + Software Setup for Recording YouTube Tutorials</title><link>https://tutorialedge.net/uses/</link><pubDate>Sat, 02 Mar 2019 18:52:03 +0000</pubDate><guid>https://tutorialedge.net/uses/</guid><description>&lt;p&gt;I&amp;rsquo;m constantly getting questions on what software/plugins/hardware I use to record my YouTube videos so I thought I&amp;rsquo;d write it up in one convenient place and just link this whenever the question pops up!&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;🧙 &lt;strong&gt;Note&lt;/strong&gt; - This was inspired by Wes Bos, who I am huge fan of! This list will be a living
document that I will update whenever anything changes!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Here&amp;rsquo;s a photo of my setup as it stands today:&lt;/p&gt;</description></item><item><title>Building a Real-time YouTube Subscriber Monitor in Go</title><link>https://tutorialedge.net/golang/building-realtime-youtube-sub-monitor-go/</link><pubDate>Sat, 23 Feb 2019 09:45:55 +0000</pubDate><guid>https://tutorialedge.net/golang/building-realtime-youtube-sub-monitor-go/</guid><description>&lt;p&gt;&lt;strong&gt;Welcome Everyone! In this tutorial, we are going to be having a bit of fun and we are
going to be creating a real-time YouTube stats monitoring system in Go.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, we are going to be looking at a number of different topics within this
tutorial such as creating a WebSocket server and using WebSockets to communicate
in real-time with a frontend application, as well as how you can interact with
an existing REST API to get the subscriber stats we need.&lt;/p&gt;</description></item><item><title>Uploading Files in Go - Tutorial</title><link>https://tutorialedge.net/golang/go-file-upload-tutorial/</link><pubDate>Sat, 09 Feb 2019 18:32:11 +0000</pubDate><guid>https://tutorialedge.net/golang/go-file-upload-tutorial/</guid><description>&lt;p&gt;Hi everybody! In this tutorial, we are going to be building a really simple
file-upload HTTP server that allows you to upload your files to the server
running your Go application.&lt;/p&gt;
&lt;p&gt;There are countless different reasons why you would want to do this, you could
be uploading CSV reports for further processing within your complex financial
system, or you could be creating a cool image manipulation app that allows you
to modify various aspects of any photos you want to upload.&lt;/p&gt;</description></item><item><title>Scope and Ownership in Rust</title><link>https://tutorialedge.net/rust/scope-ownership-in-rust/</link><pubDate>Wed, 30 Jan 2019 14:36:39 +0000</pubDate><guid>https://tutorialedge.net/rust/scope-ownership-in-rust/</guid><description>&lt;p&gt;In Rust, every data value has a single owning scope—no more, no less. So, what&amp;rsquo;s
a scope? The easy answer is that a scope is the place where a block expression
stores its variables. Scopes are not directly represented in the source code,
but a scope begins when a block expression begins, with a &lt;code&gt;{&lt;/code&gt; symbol, and ends
when the block expression ends, with &lt;code&gt;}&lt;/code&gt; (or when a &lt;code&gt;return&lt;/code&gt; statement is run
before the block reaches its end). The scope is the chunk of memory where the
block&amp;rsquo;s variables are stored.&lt;/p&gt;</description></item><item><title>Components, Templates, and Props in Vue.js 2</title><link>https://tutorialedge.net/javascript/vuejs/components-templates-and-props-vue-2/</link><pubDate>Wed, 30 Jan 2019 14:08:59 +0000</pubDate><guid>https://tutorialedge.net/javascript/vuejs/components-templates-and-props-vue-2/</guid><description>&lt;p&gt;To begin, let&amp;rsquo;s look at how to make a component in Vue. First, we specify the
component, like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Vue&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;component&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;custom-article&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; template&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;`
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt; &amp;lt;article&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt; Our own custom article component!&amp;lt;span&amp;gt;&amp;lt;/span&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#a3be8c"&gt; &amp;lt;/article&amp;gt;`&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;new&lt;/span&gt; Vue&lt;span style="color:#eceff4"&gt;({&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; el&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;#app&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A component is a block of code that we give a custom name. This custom name can
be anything we come up with, and it&amp;rsquo;s a single label for that entire block of
code in the form of a custom HTML tag. In the previous example, we grouped
the article and span tags and gave that custom tag the name of custom-article.&lt;/p&gt;</description></item><item><title>Linked Lists in Go - Tutorial</title><link>https://tutorialedge.net/golang/go-linked-lists-tutorial/</link><pubDate>Mon, 21 Jan 2019 19:07:28 +0000</pubDate><guid>https://tutorialedge.net/golang/go-linked-lists-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to be taking a look at how you can create and work with linked lists in Go.&lt;/p&gt;
&lt;p&gt;Linked lists are a very useful data structure in computer science that can be used for a wide variety of different tasks. They are also heavily used within programming interview questions, so a good knowledge of how they work and how you can create one in Go is vital if you want to land a new job!&lt;/p&gt;</description></item><item><title>Setting Up your Development Environment for Building a Genetic Adversarial Network</title><link>https://tutorialedge.net/python/data-science/setting-up-dev-environment-building-gan/</link><pubDate>Sat, 19 Jan 2019 11:11:06 +0000</pubDate><guid>https://tutorialedge.net/python/data-science/setting-up-dev-environment-building-gan/</guid><description>&lt;p&gt;What&amp;rsquo;s a development environment? Everyone thinks setting up
a development environment needs to be this incredibly arduous process. The
installation process could be worse. It&amp;rsquo;s actually quite simple and this article
intends to show you the basics.&lt;/p&gt;
&lt;h2 id="getting-ready"&gt;
 &lt;a href="#getting-ready" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Getting ready&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s lay out the requirements for the equipment you&amp;rsquo;ll need:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;GPU: 10 series CUDA-enabled Nidea GPU&lt;/li&gt;
&lt;li&gt;Operating system: Ubuntu Linux 16.04+&lt;/li&gt;
&lt;li&gt;CPU/RAM: i5 or i7 with at least 8 GB of RAM&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;First and foremost, the GPU is a requirement. Although these algorithms can
technically train on a CPU, it could take days in some cases for a single model
to converge. It can take a GPU a day or more to converge in some instances. GPUs
offer an immense computational power increase over CPUs and are hence a
necessity. It&amp;rsquo;s easy today to find a laptop with a 1,060 or better in it for
around $900.&lt;/p&gt;</description></item><item><title>Preparing a Dataset for Machine Learning with scikit-learn</title><link>https://tutorialedge.net/python/data-science/preparing-dataset-machine-learning-scikit-learn/</link><pubDate>Sat, 19 Jan 2019 10:53:22 +0000</pubDate><guid>https://tutorialedge.net/python/data-science/preparing-dataset-machine-learning-scikit-learn/</guid><description>&lt;p&gt;The first step to implementing any machine learning algorithm with scikit-learn
is data preparation. Scikit-learn comes with a set of constraints to
implementation. The dataset that we will be using is based on mobile payments
and is found on the world&amp;rsquo;s most popular competitive machine learning website –
Kaggle. You can download the dataset
from: &lt;a href="https://www.kaggle.com/ntnu-testimon/paysim1"
 title="https://www.kaggle.com/ntnu-testimon/paysim1" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 https://www.kaggle.com/ntnu-testimon/paysim1&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Once downloaded, open a new Jupyter Notebook using the following code in
Terminal (macOS/Linux) or Anaconda Prompt/PowerShell (Windows):&lt;/p&gt;</description></item><item><title>Working with Temporary Files and Directories in Go 1.11</title><link>https://tutorialedge.net/golang/temporary-files-directories-go-111/</link><pubDate>Thu, 10 Jan 2019 11:21:58 +0000</pubDate><guid>https://tutorialedge.net/golang/temporary-files-directories-go-111/</guid><description>&lt;p&gt;Go provides excellent built-in support for creating temporary files and directories
using the &lt;code&gt;TempFile&lt;/code&gt; and &lt;code&gt;TempDir&lt;/code&gt; functions within the &lt;code&gt;os&lt;/code&gt; package.&lt;/p&gt;
&lt;p&gt;The temporary files and directories created from these function calls are
globally unique and this is awesome as it simplifies the way we handle hundreds
or even thousands of files within our Go programs.&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be looking at how you can use these within your own Go
programs and some potential use cases. Note that while &lt;code&gt;ioutil&lt;/code&gt; was historically used,
modern Go (1.16+) recommends using the &lt;code&gt;os&lt;/code&gt; package directly for these operations.&lt;/p&gt;</description></item><item><title>Go Graphql Beginners Tutorial - Part 2</title><link>https://tutorialedge.net/golang/go-graphql-beginners-tutorial-part-2/</link><pubDate>Fri, 28 Dec 2018 20:56:55 +0000</pubDate><guid>https://tutorialedge.net/golang/go-graphql-beginners-tutorial-part-2/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This tutorial is part of a 2-part mini-series on GraphQL, the first
part of this tutorial can be found here:
&lt;a href="./golang/go-graphql-beginners-tutorial/"
 title="Go GraphQL Beginners Tutorial - Part 1" 
 &gt;
 Go GraphQL Beginners Tutorial - Part 1&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome fellow Gophers! In this tutorial, we are going to be expanding upon the
work we did in our previous GraphQL Go tutorial and looking at mutations and
implementing proper data-sources behind our GraphQL API.&lt;/p&gt;</description></item><item><title>Go GraphQL Beginners Tutorial</title><link>https://tutorialedge.net/golang/go-graphql-beginners-tutorial/</link><pubDate>Thu, 27 Dec 2018 18:46:19 +0000</pubDate><guid>https://tutorialedge.net/golang/go-graphql-beginners-tutorial/</guid><description>&lt;p&gt;Welcome fellow Gophers! In this tutorial, we are going to be looking at how we
can interact with a GraphQL server within our Go-based programs. By the end of
this tutorial, we should hopefully know how to do the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The basics of GraphQL&lt;/li&gt;
&lt;li&gt;Build a Simple GraphQL Server in Go&lt;/li&gt;
&lt;li&gt;Perform basic queries against GraphQL&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;We&amp;rsquo;ll be focused on the data-retrieval side of GraphQL in this tutorial and
we&amp;rsquo;ll back it with an in-memory data source. This should give us a good base to
build up on top of in subsequent tutorials.&lt;/p&gt;</description></item><item><title>Go Variadic Function Tutorial</title><link>https://tutorialedge.net/golang/go-variadic-function-tutorial/</link><pubDate>Thu, 06 Dec 2018 21:38:44 +0000</pubDate><guid>https://tutorialedge.net/golang/go-variadic-function-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This tutorial is a follow-on from my previous article on regular
functions in Go: &lt;a href="./golang/go-functions-tutorial/"
 title="Go Functions Tutorial" 
 &gt;
 Go Functions Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, we are going to be looking at &lt;code&gt;Variadic Functions&lt;/code&gt; in Go.
We&amp;rsquo;ll be covering how to implement and how to use these functions within your
own Go applications.&lt;/p&gt;
&lt;h2 id="variadic-functions"&gt;
 &lt;a href="#variadic-functions" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Variadic Functions&lt;/h2&gt;
&lt;p&gt;There are times, when we do not know how many string arguments we will require
for our functions. This is where &lt;code&gt;variadic functions&lt;/code&gt; come into play.&lt;/p&gt;</description></item><item><title>Go WaitGroup Tutorial</title><link>https://tutorialedge.net/golang/go-waitgroup-tutorial/</link><pubDate>Wed, 05 Dec 2018 13:03:31 +0000</pubDate><guid>https://tutorialedge.net/golang/go-waitgroup-tutorial/</guid><description>&lt;p&gt;If you are just starting your journey about learning Go and how to implement
highly concurrent, high-performance applications, then an understanding of
WaitGroups is vital.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be covering the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What &lt;code&gt;WaitGroups&lt;/code&gt; are and when we should use them&lt;/li&gt;
&lt;li&gt;A simple example of working with &lt;code&gt;WaitGroups&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;A real world example of &lt;code&gt;WaitGroups&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;By the end of this, you should have a solid grasp as to how to employ
&lt;code&gt;WaitGroups&lt;/code&gt; within your own concurrent Go applications.&lt;/p&gt;</description></item><item><title>Working With Environment Variables in Go</title><link>https://tutorialedge.net/golang/working-with-environment-variables-in-go/</link><pubDate>Tue, 04 Dec 2018 16:15:42 +0000</pubDate><guid>https://tutorialedge.net/golang/working-with-environment-variables-in-go/</guid><description>&lt;p&gt;As we start to build ever more complex Go-based applications, we start to face
challenges when it comes to safely introducing new features, or handling
credentials for the likes of databases, or brokers.&lt;/p&gt;
&lt;p&gt;Using environment variables is an excellent way to simplify a number of
different aspects such as handling credentials across various different
environments, as well as simplifying the implementation of feature flags in your
system.&lt;/p&gt;
&lt;p&gt;In this tutorial, we will be covering:&lt;/p&gt;</description></item><item><title>The Min-Max Algorithm in Java</title><link>https://tutorialedge.net/artificial-intelligence/min-max-algorithm-in-java/</link><pubDate>Wed, 28 Nov 2018 11:50:17 +0000</pubDate><guid>https://tutorialedge.net/artificial-intelligence/min-max-algorithm-in-java/</guid><description>&lt;p&gt;In order to understand the min-max algorithm, you should get familiar with game
playing and game trees. Game playing can be classified as game trees. What is a
game tree? A tree is made of a &lt;strong&gt;root&lt;/strong&gt; node, and a root node has child nodes;
each child node is subdivided into multiple children.&lt;/p&gt;
&lt;p&gt;This forms a tree, and the terminal nodes are termed &lt;strong&gt;leaves&lt;/strong&gt;, as shown in
the following diagram:&lt;/p&gt;</description></item><item><title>Writing a Frontend Web Framework with WebAssembly And Go</title><link>https://tutorialedge.net/golang/writing-frontend-web-framework-webassembly-go/</link><pubDate>Sun, 28 Oct 2018 10:28:34 +0000</pubDate><guid>https://tutorialedge.net/golang/writing-frontend-web-framework-webassembly-go/</guid><description>&lt;p&gt;JavaScript Frontend frameworks have undoubtedly helped to push the boundaries of
what was previously possible in the context of a browser. Ever more complex
applications have come out built on top of the likes of React, Angular and VueJS
to name but a few and there&amp;rsquo;s the well known joke about how a new frontend
framework seems to come out every day.&lt;/p&gt;
&lt;p&gt;However, this pace of development is exceptionally good news for developers
around the world. With each new framework, we discover better ways of handling
state, or rendering efficiently with things like the shadow DOM.&lt;/p&gt;</description></item><item><title>Stability Patterns in Angular</title><link>https://tutorialedge.net/typescript/angular/stability-patterns-in-angular/</link><pubDate>Mon, 22 Oct 2018 12:46:35 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/stability-patterns-in-angular/</guid><description>&lt;p&gt;Stability is one of the cornerstones of software engineering. No matter what,
you must expect the worst from your environment and your users, and be prepared
for it. Your Angular applications should be able to operate in a degraded mode
when your backend is burning and smoothly recover when it comes back online. In
this article, you’ll learn about stability patterns, timeouts and the circuit
breaker.&lt;/p&gt;
&lt;h2 id="timeouts"&gt;
 &lt;a href="#timeouts" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Timeouts&lt;/h2&gt;
&lt;p&gt;You can never trust an API to work as expected, even if it is your own API. You
should always expect everything that can go wrong to, well, go wrong. One of the
less harmful things that can happen when trying to communicate with your backend
is that it won&amp;rsquo;t respond. While this one-way communication is harmless for your
Angular applications, it is most frustrating for your users.&lt;/p&gt;</description></item><item><title>Building an IMDB Top 250 Clone with Pandas</title><link>https://tutorialedge.net/python/building-imdb-top-250-clone-pandas/</link><pubDate>Sun, 21 Oct 2018 19:20:13 +0100</pubDate><guid>https://tutorialedge.net/python/building-imdb-top-250-clone-pandas/</guid><description>&lt;p&gt;The Internet Movie Database (IMDB) maintains a chart called the IMDB Top
250, which is a ranking of the top 250 movies according to a certain scoring
metric. All the movies in this list are non-documentary, theatrical releases
with a runtime of at least 45 minutes and over 250,000 ratings:&lt;/p&gt;
&lt;p&gt;&lt;img src="https://s3.eu-west-1.amazonaws.com/images.tutorialedge.net/images/python/recommender-system-python/image1-17.png" alt="IMDB Recommender system" /&gt;&lt;/p&gt;
&lt;p&gt;This chart can be considered the simplest of recommenders. It doesn&amp;rsquo;t take into
consideration the tastes of a particular user nor does it try to deduce
similarities between different movies. It simply calculates a score for every
movie based on a predefined metric and outputs a sorted list of movies based on
that score.&lt;/p&gt;</description></item><item><title>Improving Your Go Tests and Mocks With Testify</title><link>https://tutorialedge.net/golang/improving-your-tests-with-testify-go/</link><pubDate>Sat, 13 Oct 2018 09:53:51 +0100</pubDate><guid>https://tutorialedge.net/golang/improving-your-tests-with-testify-go/</guid><description>&lt;blockquote&gt;
&lt;p&gt;🚀 My new course - &lt;a href="./courses/go-testing-bible/"
 title="The Golang Testing Bible" 
 &gt;
 The Golang Testing Bible&lt;/a&gt; is out now and covers everything you need to get up and running creating tests for your Go applications!&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Assertions are something that I genuinely feel the standard library in Go is
missing. You can most definitely achieve the same results with the likes of &lt;code&gt;if&lt;/code&gt;
comparisons and whatever else, but it&amp;rsquo;s not the cleanest way to write your test
files.&lt;/p&gt;</description></item><item><title>Creating a Custom Diffuse Lighting Model in Unity - Tutorial</title><link>https://tutorialedge.net/gamedev/unity/custom-diffuse-lighting-model-unity-tutorial/</link><pubDate>Mon, 01 Oct 2018 18:49:06 +0100</pubDate><guid>https://tutorialedge.net/gamedev/unity/custom-diffuse-lighting-model-unity-tutorial/</guid><description>&lt;p&gt;If you are familiar with Unity 4, you may know that the default shader provided
by it was based on a lighting model called the Lambertian reflectance. This
article shows you how you can create a shader with a custom lighting model and
explains the mathematics involved along with the implementation. The following
diagram shows the same geometry rendered with a standard shader (right) and a
diffuse Lambert one (left):&lt;/p&gt;</description></item><item><title>How to Conduct ARP Spoofing for MITM Attacks - Tutorial</title><link>https://tutorialedge.net/security/arp-spoofing-for-mitm-attack-tutorial/</link><pubDate>Sun, 30 Sep 2018 14:29:55 +0100</pubDate><guid>https://tutorialedge.net/security/arp-spoofing-for-mitm-attack-tutorial/</guid><description>&lt;h2 id="man-in-the-middle-attacks"&gt;
 &lt;a href="#man-in-the-middle-attacks" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Man-in-the-middle attacks&lt;/h2&gt;
&lt;p&gt;A man-in-the-middle (MITM) attack is one of the most dangerous and effective
attacks that you can carry out in a network. You can only perform it once you’re
connected to the network.&lt;/p&gt;
&lt;p&gt;It can be used to redirect the flow of packets from any client to your device.
This means that any packet that is sent to or from the client will have to go
through your device, and since you know the password and the key to the network,
you’ll be able to read those packets. This attack is so effective because it&amp;rsquo;s
very hard to protect against.&lt;/p&gt;</description></item><item><title>How to Create a Customary Hello Angular App – Guess the Number!</title><link>https://tutorialedge.net/typescript/angular/guess-the-number-angular-6-beginners-tutorial/</link><pubDate>Wed, 25 Jul 2018 15:42:51 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/guess-the-number-angular-6-beginners-tutorial/</guid><description>&lt;p&gt;&lt;em&gt;Learn how to create a customary Hello Angular App – Guess the Number! in this
tutorial by Kevin Hennessy, a developer, team lead, and solutions architect,
working on web-based projects, primarily using the Microsoft technology stack.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;This article will help you create a simple “Guess the Number!” game, which will
serve as a platform to launch you into the world of Angular and showcase the
framework&amp;rsquo;s capabilities. The objective of the game is to guess a random
computer-generated number in as few tries as possible.&lt;/p&gt;</description></item><item><title>Building Real-time ReactJS Applications with Socket.Io - Tutorial</title><link>https://tutorialedge.net/react/react-socket-io-tutorial/</link><pubDate>Sun, 15 Jul 2018 09:13:28 +0100</pubDate><guid>https://tutorialedge.net/react/react-socket-io-tutorial/</guid><description>&lt;p&gt;In this article, we are going to be looking at how you can implement real-time
websocket-based communication within your ReactJS web application.&lt;/p&gt;
&lt;h2 id="why-websockets"&gt;
 &lt;a href="#why-websockets" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Websockets?&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve covered this numerous times in previous articles on this site as to why we
should use websockets within our applications.&lt;/p&gt;
&lt;p&gt;The benefits are numerous, and when we use socket.io, these benefits can be
realized with minimal added complexity.&lt;/p&gt;
&lt;p&gt;Let&amp;rsquo;s have a look at a real-life example. Imagine you had a real-time monitoring
application that continually polled the status of the fleet of 100 servers that
currently host your services.&lt;/p&gt;</description></item><item><title>Docker for Go Developers</title><link>https://tutorialedge.net/docker/docker-for-go-developers/</link><pubDate>Sat, 14 Jul 2018 22:33:43 +0100</pubDate><guid>https://tutorialedge.net/docker/docker-for-go-developers/</guid><description>&lt;p&gt;In this tutorial, we are going to look at how we can leverage Docker as Go
developers.&lt;/p&gt;
&lt;p&gt;By the end of this tutorial, we will have covered the following topics:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Creating a Simple Dockerfile for a simple Go Program&lt;/li&gt;
&lt;li&gt;Mounting Volumes in Docker&lt;/li&gt;
&lt;li&gt;Auto-build on changes&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="our-basic-go-program"&gt;
 &lt;a href="#our-basic-go-program" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our Basic Go Program&lt;/h2&gt;
&lt;p&gt;For the purpose of this tutorial, we&amp;rsquo;ll be using the code from my
&lt;a href="./golang/creating-simple-web-server-with-golang/"
 title="go WebServer tutorial" 
 &gt;
 go WebServer tutorial&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;html&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;net/http&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;HandleFunc&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;/&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;ResponseWriter&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; r &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Request&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fprintf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Hello, %q&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; html&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;EscapeString&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;r&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;URL&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Path&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;HandleFunc&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;/hi&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;ResponseWriter&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; r &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Request&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fprintf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;w&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34;Hi&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fatal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;http&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;ListenAndServe&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;:8080&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt;&lt;span style="color:#eceff4"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="a-simple-example"&gt;
 &lt;a href="#a-simple-example" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;A Simple Example&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s start by creating a simple &lt;code&gt;Dockerfile&lt;/code&gt; that will allow us to run a very
simple Go program that runs on port 8080.&lt;/p&gt;</description></item><item><title>Async/Await in Typescript - Tutorial</title><link>https://tutorialedge.net/typescript/async-await-in-typescript-tutorial/</link><pubDate>Tue, 19 Jun 2018 20:29:57 +0100</pubDate><guid>https://tutorialedge.net/typescript/async-await-in-typescript-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to be looking at how you can use both the &lt;code&gt;async&lt;/code&gt;
and &lt;code&gt;await&lt;/code&gt; keywords within your TypeScript application and subsequently improve
the readibility and succinctness of your code.&lt;/p&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;If you have come from a Node.JS background, you&amp;rsquo;ll most likely be familiar with
something we know as Callback Hell. This is where you end up with code within
your Node.JS applications that look akin to the Pyramids from ancient Giza.&lt;/p&gt;</description></item><item><title>Typescript REST API And MongoDB Beginners Tutorial</title><link>https://tutorialedge.net/typescript/typescript-mongodb-beginners-tutorial/</link><pubDate>Sun, 10 Jun 2018 18:56:37 +0000</pubDate><guid>https://tutorialedge.net/typescript/typescript-mongodb-beginners-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Source Code&lt;/strong&gt; - The full source code for this tutorial can be found here: &lt;a href="https://github.com/TutorialEdge/TypeScript-MongoDB-REST-Tutorial"
 title="github.com/TutorialEdge/TypeScript-MongoDB-REST-Tutorial" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 github.com/TutorialEdge/TypeScript-MongoDB-REST-Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be building a very simple REST API that will allow you
to store, query, update and delete books from a book table within your MongoDB
instance. This will hopefully cover everything you need to get a basic project
up yourself for your own side projects.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;
 &lt;a href="#prerequisites" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;In order to complete this tutorial, you are going to need the following:&lt;/p&gt;</description></item><item><title>Part 1 - An Introduction to GitHub Actions</title><link>https://tutorialedge.net/courses/ogimg-dev/deployment-01/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/deployment-01/</guid><description>&lt;p&gt;In this episode, we are going to be taking a look at how you can get started writing your own GitHub actions for the project. This will give us the foundation upon which we can start to build more complex GitHub actions that will do things such as automatically test and deploy our project up into a production environment.&lt;/p&gt;</description></item><item><title>Part 1 - Creating our Frontend</title><link>https://tutorialedge.net/courses/ogimg-dev/frontend-01/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/frontend-01/</guid><description>&lt;p&gt;In this series, we are going to be building a full SaaS Web Application using React.js and Node.js! This will cover everything from setting up the project through to building the individual components and then through to deployment through automation.&lt;/p&gt;
&lt;p&gt;The SaaS product will allow developers to programmatically generate OpenGraph images for their social media posts.&lt;/p&gt;
&lt;h3 id="topics-covered"&gt;
 &lt;a href="#topics-covered" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Topics Covered:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Styling our App with Tailwind CSS&lt;/li&gt;
&lt;li&gt;Using Hooks within our React.js App&lt;/li&gt;
&lt;li&gt;Integration with Auth0&lt;/li&gt;
&lt;li&gt;Integration with Stripe for payments&lt;/li&gt;
&lt;li&gt;Generating Images with Node.js&lt;/li&gt;
&lt;li&gt;Building a REST API with Node.js&lt;/li&gt;
&lt;li&gt;Securing Endpoints with JWTs&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="episode-01"&gt;
 &lt;a href="#episode-01" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Episode 01&lt;/h3&gt;
&lt;p&gt;In this tutorial, we cover setting up our project directory and bootstrapping our React.js application using the &lt;code&gt;create-react-app&lt;/code&gt; CLI.&lt;/p&gt;</description></item><item><title>Part 1 - Setting Up Your Development Environment</title><link>https://tutorialedge.net/courses/ogimg-dev/backend-01/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/backend-01/</guid><description>&lt;p&gt;In this episode, we are going to be looking at what it takes to build the foundations of our Express.js API that is effectively going to underpin our SaaS product.&lt;/p&gt;</description></item><item><title>Part 2 - Adding TailwindCSS to our Frontend Application</title><link>https://tutorialedge.net/courses/ogimg-dev/frontend-02/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/frontend-02/</guid><description>&lt;p&gt;In this tutorial, we are going to look at how you can add Tailwind CSS to our frontend React.js application. This will enable us to quickly style our application and make it responsive across different devices.&lt;/p&gt;</description></item><item><title>Part 2 - An Introduction to Handlebars</title><link>https://tutorialedge.net/courses/ogimg-dev/backend-02/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/backend-02/</guid><description>&lt;p&gt;In this episode, we are going to be looking at how we can generate the HTML that we are going to be taking screenshots of using the &lt;code&gt;Handlerbars.js&lt;/code&gt; library.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll start off by building a really simple async function that will take in a JavaScript object and interpolate that into a HTML template before returning the compiled result.&lt;/p&gt;</description></item><item><title>Part 3 - Creating a Function Component and using Hooks</title><link>https://tutorialedge.net/courses/ogimg-dev/frontend-03/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/frontend-03/</guid><description>&lt;p&gt;In this tutorial, we are going to build our first React component and explore how we can get started using hooks.&lt;/p&gt;
&lt;p&gt;Below you will find the full source code for the header component to help you out a little!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-jsx" data-lang="jsx"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; React from &lt;span style="color:#a3be8c"&gt;&amp;#39;react&amp;#39;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;function&lt;/span&gt; Header&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;const&lt;/span&gt; &lt;span style="color:#eceff4"&gt;[&lt;/span&gt;navbarOpen&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; setNavbarOpen&lt;span style="color:#eceff4"&gt;]&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; React&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;useState&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;false&lt;/span&gt;&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;nav&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;flex items-center justify-between flex-wrap p-6&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;flex items-center flex-shrink-0 text-dark-gray mr-6&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;span&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;font-semibold text-xl tracking-tight&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;Open Graph Image API&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;span&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;block lg:hidden&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;button&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8fbcbb"&gt;onClick&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;=&amp;gt;&lt;/span&gt; setNavbarOpen&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;!&lt;/span&gt;navbarOpen&lt;span style="color:#eceff4"&gt;)}&lt;/span&gt; 
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;flex items-center px-3 py-2 border rounded text-gray-800 border-gray-800 hover:text-gray-600 hover:border-gray-600&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;svg&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;fill-current h-3 w-3&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;viewBox&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;0 0 20 20&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;xmlns&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;http://www.w3.org/2000/svg&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;title&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;Menu&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;title&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;path&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;d&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;M0 3h20v2H0V3zm0 6h20v2H0V9zm0 6h20v2H0v-2z&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;/&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;svg&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;button&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;lg:flex flex-grow items-center&amp;#34;&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;+&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;navbarOpen &lt;span style="color:#81a1c1"&gt;?&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34; w-full flex&amp;#34;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;:&lt;/span&gt; &lt;span style="color:#a3be8c"&gt;&amp;#34; hidden&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)}&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;flex flex-col lg:flex-row list-none lg:ml-auto&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;a&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;href&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;block mt-4 lg:inline-block lg:mt-0 text-gray-800 hover:text-dark-gray mr-4 sm:w-auto&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;span&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;role&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;img&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;aria&lt;/span&gt;&lt;span style="color:#bf616a"&gt;-&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;label&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Profile&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#bf616a"&gt;⚙️&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;span&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; Profile
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;a&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;a&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;href&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;/&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;className&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;block mt-4 lg:inline-block lg:mt-0 text-gray-800 hover:text-dark-gray mr-4 sm:w-auto&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;span&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;role&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;img&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;aria&lt;/span&gt;&lt;span style="color:#bf616a"&gt;-&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;label&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Sign Up&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;&lt;span style="color:#bf616a"&gt;✍&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;span&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt; Sign Up
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;a&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;nav&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;export&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;default&lt;/span&gt; Header&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Part 3 - Generating Images with Puppeteer</title><link>https://tutorialedge.net/courses/ogimg-dev/backend-03/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/backend-03/</guid><description>&lt;p&gt;Now that we&amp;rsquo;ve been able to successfully generate the HTML using JSON input, it&amp;rsquo;s time to take this generated HTML and generate an image from it using the &lt;code&gt;puppeteer&lt;/code&gt; library.&lt;/p&gt;
&lt;p&gt;Puppeteer will effectively allow us to run a headless version of chrome within our Node project and it will be able to load our html and render it just as a browser would before we then set about taking a screenshot.&lt;/p&gt;</description></item><item><title>Part 4 - Setting up React Router</title><link>https://tutorialedge.net/courses/ogimg-dev/frontend-04/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/frontend-04/</guid><description>&lt;p&gt;In this tutorial, we are going to add React Router to our application so that we can handle multiple different pages within our App.&lt;/p&gt;</description></item><item><title>Part 5 - Styling our Homepage with Tailwind</title><link>https://tutorialedge.net/courses/ogimg-dev/frontend-05/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/courses/ogimg-dev/frontend-05/</guid><description>&lt;p&gt;In this tutorial, we are going to be styling our homepage so that prospective clients can see what we have to offer!&lt;/p&gt;</description></item><item><title>Testing a TypeScript API With Mocha and Chai</title><link>https://tutorialedge.net/typescript/testing-typescript-api-with-mocha-chai/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/typescript/testing-typescript-api-with-mocha-chai/</guid><description>&lt;blockquote&gt;
&lt;p&gt;We are going to be using the
&lt;a href="./typescript/creating-rest-api-express-typescript/"
 title="very simple TypeScript API" 
 &gt;
 very simple TypeScript API&lt;/a&gt;
we developed in a previous tutorial in order to learn about Mocha and Chai
Testing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be looking at how you can get a very simple test
framework up and running for your TypesScript based API using the &lt;code&gt;mocha&lt;/code&gt; and
&lt;code&gt;chai&lt;/code&gt; testing libraries.&lt;/p&gt;
&lt;h2 id="why-do-we-test"&gt;
 &lt;a href="#why-do-we-test" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Do We Test?&lt;/h2&gt;
&lt;p&gt;Being able to accurately test any application you build is hugely important for
any software developer regardless of the technology stack they are working with.
Having a test suite probe your system to ensure that it performs as expected
when called into action helps to ensure that any new changes or bug-fixes to the
code don&amp;rsquo;t impact old functions and subsequently start causing reliant systems
to fail.&lt;/p&gt;</description></item><item><title>Testing Typescript Api With Jest and Supertest</title><link>https://tutorialedge.net/typescript/testing-typescript-api-with-jest/</link><pubDate>Sat, 09 Jun 2018 22:48:26 +0100</pubDate><guid>https://tutorialedge.net/typescript/testing-typescript-api-with-jest/</guid><description>&lt;blockquote&gt;
&lt;p&gt;We are going to be using the
&lt;a href="./typescript/creating-rest-api-express-typescript/"
 title="very simple TypeScript API" 
 &gt;
 very simple TypeScript API&lt;/a&gt;
we developed in a previous tutorial in order to learn about Jest Testing.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be looking at how you can get a very simple test
framework up and running for your TypesScript based API using the &lt;code&gt;jest&lt;/code&gt; and
&lt;code&gt;supertest&lt;/code&gt; testing libraries.&lt;/p&gt;
&lt;h2 id="installation"&gt;
 &lt;a href="#installation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Installation&lt;/h2&gt;
&lt;p&gt;Now that we have gotten the &lt;code&gt;why?&lt;/code&gt; out of the way, let&amp;rsquo;s see how we can go about
implementing our own testing framework:&lt;/p&gt;</description></item><item><title>Getting Started with Typescript and Socket.Io - Tutorial</title><link>https://tutorialedge.net/typescript/typescript-socket-io-tutorial/</link><pubDate>Wed, 30 May 2018 18:09:26 +0100</pubDate><guid>https://tutorialedge.net/typescript/typescript-socket-io-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Last Updated -&lt;/strong&gt; 24th December, 2018&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Welcome friends! In this tutorial, we are going to be looking at how you can
build a websocket based server using both TypeScript and Socket.io.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll be covering the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;What WebSockets are and why they are beneficial&lt;/li&gt;
&lt;li&gt;Building a Simple TypeScript WebSocket Server&lt;/li&gt;
&lt;li&gt;Building a Simple client to connect to our Server&lt;/li&gt;
&lt;li&gt;Two-way communication between our client and our server&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="websockets"&gt;
 &lt;a href="#websockets" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;WebSockets&lt;/h2&gt;
&lt;p&gt;WebSockets are an awesome technology and I absolutely love playing around with
them and creating real-time applications. I&amp;rsquo;ve used them for quite a number of
different applications now in combination with other frontend frameworks such as
Angular and Vue.JS.&lt;/p&gt;</description></item><item><title>Working With Docker and NodeJS - Tutorial</title><link>https://tutorialedge.net/docker/working-with-docker-nodejs/</link><pubDate>Sun, 27 May 2018 21:40:20 +0100</pubDate><guid>https://tutorialedge.net/docker/working-with-docker-nodejs/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The full source code for this tutorial can be found here:
&lt;a href="https://github.com/TutorialEdge/Docker/tree/master/node-docker"
 title="TutorialEdge/Docker/node-docker" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 TutorialEdge/Docker/node-docker&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, we are going to be looking at how you can dockerize an
existing NodeJS application and ultimately leverage the benefits of Docker.
We&amp;rsquo;ll be creating a Docker image that will dynamically pick up changes to a
NodeJS application and automatically recompile and rerun our application without
having to rebuild and re-run our docker image.&lt;/p&gt;</description></item><item><title>Getting Started With Docker</title><link>https://tutorialedge.net/docker/getting-started-with-docker/</link><pubDate>Fri, 18 May 2018 14:25:51 +0100</pubDate><guid>https://tutorialedge.net/docker/getting-started-with-docker/</guid><description>&lt;p&gt;In this tutorial, we are going to be taking a look at what Docker is, why it&amp;rsquo;s
needed and how you can get up and running using Docker in your day-to-day
development.&lt;/p&gt;
&lt;h2 id="what-is-docker"&gt;
 &lt;a href="#what-is-docker" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Is Docker?&lt;/h2&gt;
&lt;p&gt;Docker is a containerization technology that allows you to package up your
application into something that will run everywhere that Docker can run.&lt;/p&gt;
&lt;p&gt;You typically define absolutely everything you need for your application within
your docker file and no more. If your application is a Java application, then
you would typically use a Java-based Docker image that would have the exact
version of the JVM that you need.&lt;/p&gt;</description></item><item><title>Building a RESTful API using Express and TypeScript</title><link>https://tutorialedge.net/typescript/creating-rest-api-express-typescript/</link><pubDate>Wed, 28 Mar 2018 20:25:53 +0100</pubDate><guid>https://tutorialedge.net/typescript/creating-rest-api-express-typescript/</guid><description>&lt;p&gt;In this tutorial, we are going to be building a REST API using both &lt;code&gt;express&lt;/code&gt;
and TypeScript! This REST API will simply return a status depending on what API
endpoint we hit using our HTTP Client.&lt;/p&gt;
&lt;h2 id="prerequisites"&gt;
 &lt;a href="#prerequisites" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Prerequisites&lt;/h2&gt;
&lt;p&gt;You will require at least the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;TypeScript 2.8.1&lt;/li&gt;
&lt;li&gt;The Yarn Package Manager&lt;/li&gt;
&lt;li&gt;ExpressJS&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="our-project-layout"&gt;
 &lt;a href="#our-project-layout" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our Project Layout&lt;/h2&gt;
&lt;p&gt;So within our project, we are going to create a couple of incredibly simple
endpoints that will simply return a few simple strings, depending on what &lt;code&gt;HTTP&lt;/code&gt;
verb is used to hit said route.&lt;/p&gt;</description></item><item><title>Part 1 - Setting Up Our VueJS Project</title><link>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-1-setting-up-vuejs-project/</link><pubDate>Mon, 19 Mar 2018 16:24:13 +0000</pubDate><guid>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-1-setting-up-vuejs-project/</guid><description>&lt;p&gt;In this first tutorial, we will be covering exactly how you set up your
development machine so that we can start working on our HackerNews clone.&lt;/p&gt;
&lt;p&gt;We&amp;rsquo;ll get a basic VueJS application up and running and we&amp;rsquo;ll also cover how you
can build this simple project so that you end up with files that are deployable
to the likes of and S3 bucket, or a server that can serve your files.&lt;/p&gt;</description></item><item><title>Part 2 - Creating a Few Components</title><link>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-2-creating-few-components/</link><pubDate>Mon, 19 Mar 2018 16:24:13 +0000</pubDate><guid>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-2-creating-few-components/</guid><description>&lt;p&gt;In the previous tutorial, we not only managed to set up our base project and get
it running on &lt;code&gt;http://localhost:8080&lt;/code&gt;, but we also managed to build it so that
it&amp;rsquo;s ready for deployment to production. We now have a strong base project from
which we can build up up our HackerNews clone.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to create our first Single Page component which
will be our &lt;code&gt;Navbar.vue&lt;/code&gt; component. I&amp;rsquo;ll show you how you can subsequently
register this component within your Vue application and we&amp;rsquo;ll also look at how
we can customize the way our component looks by using CSS that is only applied
to said component.&lt;/p&gt;</description></item><item><title>Part 3 - Adding a Few Routes To Our App</title><link>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-3-adding-a-few-routes/</link><pubDate>Mon, 19 Mar 2018 16:24:13 +0000</pubDate><guid>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-3-adding-a-few-routes/</guid><description>&lt;p&gt;In the previous tutorial of this series, we covered single page components and
how you could build your own components and subsequently render them within your
Vue.js application. We created a simple &lt;code&gt;Navbar&lt;/code&gt; component and registered it
within our &lt;code&gt;App.vue&lt;/code&gt; component and subsequently rendered it within our
application.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to be creating a few more single-page components
and setting up a &lt;code&gt;vue-router&lt;/code&gt; so that we can navigate between different views on
our site. This will enable us to view the Top Stories on our &lt;code&gt;/&lt;/code&gt; path, we&amp;rsquo;ll
then be expanding upon these routes as we progress through the rest of this
series and start adding more components.&lt;/p&gt;</description></item><item><title>Part 4 - Hitting The HackerNews API</title><link>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-4-hitting-an-api/</link><pubDate>Mon, 19 Mar 2018 16:24:13 +0000</pubDate><guid>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-4-hitting-an-api/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The documentation for the API we will be hitting can be found here:
&lt;a href="https://github.com/HackerNews/API"
 title="HackerNews/API" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 HackerNews/API&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In most frontend web applications, you will need to start making &lt;code&gt;HTTP&lt;/code&gt; requests
in order to retrieve data from a database or get information from a RESTful API.
Being able to do this is considered almost essential these days and thus, in
this section of the course, we are going to look at how you can extend the
HackerNews project in order to make &lt;code&gt;HTTP&lt;/code&gt; requests out to the HackerNews API.&lt;/p&gt;</description></item><item><title>Part 5 - Viewing Individual News Articles</title><link>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-5-single-news-article-view/</link><pubDate>Mon, 19 Mar 2018 16:24:13 +0000</pubDate><guid>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-5-single-news-article-view/</guid><description>&lt;p&gt;In the previous tutorial, we looked at how we could show all of the latest
HackerNews stories on our &lt;code&gt;Homepage&lt;/code&gt; component and showed information like the
score and the URL of that story. Whilst this is pretty cool, it doesn&amp;rsquo;t let us
see the discussion going on around any of the stories, as we all know, this can
be the best bit!&lt;/p&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be adding a new route to our VueJS application which
will be able to render an individual story and the comments associated with it.&lt;/p&gt;</description></item><item><title>Part 6 - Advanced Components</title><link>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-6-advanced-components/</link><pubDate>Mon, 19 Mar 2018 16:24:13 +0000</pubDate><guid>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-6-advanced-components/</guid><description>&lt;p&gt;As we continue to build this HackerNews clone up, the code within some of our
components is going to increasingly grow. We need to start splitting our
application up into multiple smaller components and in order for us to do this,
we&amp;rsquo;ll first have to learn some new concepts such as passing data into components
using props.&lt;/p&gt;
&lt;p&gt;In this tutorial, we are going to create an &lt;code&gt;Item.vue&lt;/code&gt; component that will
render a single item within our &lt;code&gt;Homepage.vue&lt;/code&gt; component. The finished product
of this will look like this:&lt;/p&gt;</description></item><item><title>Part 7 - Managing State with Vuex in your VueJS Applications</title><link>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-7-managing-state-with-vuex-vuejs/</link><pubDate>Mon, 19 Mar 2018 16:24:13 +0000</pubDate><guid>https://tutorialedge.net/courses/hackernews-clone-vuejs/part-7-managing-state-with-vuex-vuejs/</guid><description>&lt;p&gt;In this tutorial, we are going to be adding Vuex to our VueJS application. We&amp;rsquo;ll
be looking at how we can improve the performance of our application and persist
data between route changes.&lt;/p&gt;
&lt;h2 id="why-vuex"&gt;
 &lt;a href="#why-vuex" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Vuex?&lt;/h2&gt;
&lt;p&gt;Vuex is a state management pattern + library for Vue.js applications.
Essentially, it acts as a centralized store for all components in an
application.&lt;/p&gt;
&lt;h3 id="vuex-core-concepts"&gt;
 &lt;a href="#vuex-core-concepts" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Vuex Core Concepts&lt;/h3&gt;
&lt;p&gt;Before we continue to flesh out our VueJS application, we should really ground
ourselves with the core concepts of Vuex. There are 5 main concepts we&amp;rsquo;ll need
to get our heads round, &lt;code&gt;state&lt;/code&gt;, &lt;code&gt;getters&lt;/code&gt;, &lt;code&gt;mutations&lt;/code&gt;, &lt;code&gt;actions&lt;/code&gt;, and
&lt;code&gt;modules&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Arrays Overview</title><link>https://tutorialedge.net/courses/go-data-structures-course/10-arrays-in-go-overview/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/10-arrays-in-go-overview/</guid><description>&lt;p&gt;Arrays are the first data structure we are going to look at in depth. Arrays are basically lists or items that we can add and remove items to and from.&lt;/p&gt;
&lt;p&gt;Arrays are quite possibly the most commonly used data structure you&amp;rsquo;ll encounter when programming in just about any programming language and it&amp;rsquo;s important that you have a handle as to how they work under the covers.&lt;/p&gt;
&lt;h2 id="arrays-in-go"&gt;
 &lt;a href="#arrays-in-go" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Arrays in Go&lt;/h2&gt;
&lt;p&gt;In Go, we can initialize new Array variables by using this syntax &lt;code&gt;[n]T&lt;/code&gt; where n is the exact number of elements you have in the array and T is the type.&lt;/p&gt;</description></item><item><title>Creating Buckets</title><link>https://tutorialedge.net/courses/go-aws-s3-course/04-creating-buckets/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-aws-s3-course/04-creating-buckets/</guid><description>&lt;p&gt;In the last video, we looked at how we could retrieve and list all of the buckets within our AWS account. In this video, we&amp;rsquo;ll be looking at how we can create a bucket using the same approach by setting up a session and creating an S3 service instance.&lt;/p&gt;
&lt;p&gt;This is the bucket we&amp;rsquo;ll be subsequently using for the rest of the videos within this course!&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s dive into our &lt;code&gt;main.go&lt;/code&gt; file and start by creating a new session and S3 service instance:&lt;/p&gt;</description></item><item><title>Deleting Items from S3</title><link>https://tutorialedge.net/courses/go-aws-s3-course/06-deleting-items/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-aws-s3-course/06-deleting-items/</guid><description>&lt;p&gt;In this video, we are going to be looking at how we can implement a &lt;code&gt;deleteItem&lt;/code&gt; function which will allow us to delete items from our S3 bucket and clean up after ourselves:&lt;/p&gt;
&lt;h2 id="deleting-items"&gt;
 &lt;a href="#deleting-items" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Deleting Items&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s set about implementing this &lt;code&gt;deleteItem&lt;/code&gt; function now:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;deleteItem&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;sess &lt;span style="color:#81a1c1"&gt;*&lt;/span&gt;session&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Session&lt;span style="color:#eceff4"&gt;)&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	svc &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; s3&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;New&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;sess&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	input &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; &lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;s3&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;DeleteObjectInput&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Bucket&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; aws&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;String&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;go-aws-s3-course&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Key&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; aws&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;String&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;my-file.txt&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	result&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; svc&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;DeleteObject&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;input&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; aerr&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; ok &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; err&lt;span style="color:#eceff4"&gt;.(&lt;/span&gt;awserr&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Error&lt;span style="color:#eceff4"&gt;);&lt;/span&gt; ok &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#81a1c1;font-weight:bold"&gt;switch&lt;/span&gt; aerr&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Code&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#81a1c1;font-weight:bold"&gt;default&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;				log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fatal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;aerr&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;else&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fatal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;err&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Error&lt;/span&gt;&lt;span style="color:#eceff4"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Printf&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Result: %+v\n&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; result&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Let&amp;rsquo;s also update our main func:&lt;/p&gt;</description></item><item><title>Go Data Structures - Course Overview</title><link>https://tutorialedge.net/courses/go-data-structures-course/01-course-overview/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/01-course-overview/</guid><description>&lt;p&gt;Hey Gophers! Welcome to my Go Data Structures Crash Course! In this course, we will be covering some of the fundamental data structures in programming and how you can implement them in your own Go applications!&lt;/p&gt;
&lt;p&gt;Once we have covered these fundamental data structures, we&amp;rsquo;ll be moving on to look at some of the most common sorting and searching algorithms.&lt;/p&gt;
&lt;p&gt;This course will assume a fairly minimal level of Go knowledge as we&amp;rsquo;ll be trying to focus on the concepts and less so on the syntax itself.&lt;/p&gt;</description></item><item><title>Implementing a Singly Linked List in Go</title><link>https://tutorialedge.net/courses/go-data-structures-course/41-implementing-singly-linked-lists-in-go/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-data-structures-course/41-implementing-singly-linked-lists-in-go/</guid><description>&lt;p&gt;In this video, we&amp;rsquo;ll be taking forward the concepts we covered in the last video and looking at how we can implement a singly linked list in Go!&lt;/p&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;Much like all of the other data structures we&amp;rsquo;ve covered so far, we&amp;rsquo;ll be creating a struct that will house our implementation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;type&lt;/span&gt; LinkedList &lt;span style="color:#81a1c1;font-weight:bold"&gt;struct&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We&amp;rsquo;ll also want to create a &lt;code&gt;Node&lt;/code&gt; struct which will contain the definition of nodes within our linked list:&lt;/p&gt;</description></item><item><title>Listing Buckets within our S3 Account</title><link>https://tutorialedge.net/courses/go-aws-s3-course/03-listing-buckets/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-aws-s3-course/03-listing-buckets/</guid><description>&lt;p&gt;Now that we&amp;rsquo;ve covered at a very high level what the S3 service does, let&amp;rsquo;s dive in and start writing code that will allow us to list the S3 buckets available to us!&lt;/p&gt;
&lt;h2 id="credential-management"&gt;
 &lt;a href="#credential-management" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Credential Management&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - You will need to configure your aws credentials before this will work. You can find out more information on how to do that here: &lt;a href="https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html"
 title="Configuration Basics" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Configuration Basics&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s start off by creating a new &lt;code&gt;main.go&lt;/code&gt; file in which we&amp;rsquo;ll work:&lt;/p&gt;</description></item><item><title>S3 High Level Overview</title><link>https://tutorialedge.net/courses/go-aws-s3-course/02-s3-overview/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-aws-s3-course/02-s3-overview/</guid><description/></item><item><title>The Go AWS S3 Course</title><link>https://tutorialedge.net/courses/go-aws-s3-course/01-course-overview/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-aws-s3-course/01-course-overview/</guid><description/></item><item><title>Understanding ACLs</title><link>https://tutorialedge.net/courses/go-aws-s3-course/07-understanding-acls/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-aws-s3-course/07-understanding-acls/</guid><description>&lt;p&gt;We now have a handle on how we can upload and download items. It&amp;rsquo;s important now to take a step back and understand how we can ensure we are not exposing our incredibly private &lt;code&gt;hello-world.txt&lt;/code&gt; file to the wider web.&lt;/p&gt;
&lt;p&gt;In this video, we are going to cover ACLs or Access Control Lists as they are more formally known as and how we can use them to prevent unauthorized access to the contents of our buckets.&lt;/p&gt;</description></item><item><title>Uploading and Downloading Files from Our Bucket</title><link>https://tutorialedge.net/courses/go-aws-s3-course/05-downloads-and-uploads/</link><pubDate>Mon, 19 Mar 2018 11:05:52 +0000</pubDate><guid>https://tutorialedge.net/courses/go-aws-s3-course/05-downloads-and-uploads/</guid><description>&lt;p&gt;We now have a bucket that we can effectively play with. In this video, we are going to look at how we can upload and download files to and from this newly created bucket.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-go" data-lang="go"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;package&lt;/span&gt; main
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#eceff4"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;fmt&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;log&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;os&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/aws/aws-sdk-go/aws&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/aws/aws-sdk-go/aws/session&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a3be8c"&gt;&amp;#34;github.com/aws/aws-sdk-go/service/s3/s3manager&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;func&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;main&lt;/span&gt;&lt;span style="color:#eceff4"&gt;()&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	fmt&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Println&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Downloads and Uploads&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	sess&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;:=&lt;/span&gt; session&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;NewSession&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;&amp;amp;&lt;/span&gt;aws&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;Config&lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		Region&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; aws&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;String&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;us-west-2&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#81a1c1;font-weight:bold"&gt;if&lt;/span&gt; err &lt;span style="color:#81a1c1"&gt;!=&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;nil&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		log&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#88c0d0"&gt;Fatal&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;Could not get session&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With this session in place, we can then attempt to open our local file &lt;code&gt;my-file.txt&lt;/code&gt; which is just a simple txt file. We then defer closing the file and then we create a new &lt;code&gt;Uploader&lt;/code&gt; from the &lt;code&gt;s3manager&lt;/code&gt; package that we&amp;rsquo;ve imported.&lt;/p&gt;</description></item><item><title>NodeJS 404 Checker Tutorial</title><link>https://tutorialedge.net/nodejs/nodejs-404-checker-tutorial/</link><pubDate>Sun, 11 Mar 2018 14:08:54 +0000</pubDate><guid>https://tutorialedge.net/nodejs/nodejs-404-checker-tutorial/</guid><description>&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this tutorial, we&amp;rsquo;ll be looking at how you can create a nice and simple 404
broken link checker in NodeJS using the &lt;code&gt;axios&lt;/code&gt; library as well as &lt;code&gt;cheerio&lt;/code&gt; and
&lt;code&gt;is-relative-url&lt;/code&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;We will be taking advantage of the async and await keywords in this tutorial.
You can find out more on them here:
&lt;a href="./javascript/javascript-async-await-tutorial/"
 title="JavaScript async and await Tutorial" 
 &gt;
 JavaScript async and await Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Let&amp;rsquo;s begin by creating a simple &lt;code&gt;async&lt;/code&gt; function that will retrieve all of the
links from a passed in &lt;code&gt;URL&lt;/code&gt;. We&amp;rsquo;ll call this &lt;code&gt;getAllLinks(url)&lt;/code&gt;. Within the
function body, we will attempt to retrieve the &lt;code&gt;URL&lt;/code&gt; passed in with a simple
HTTP &lt;code&gt;GET&lt;/code&gt; request.&lt;/p&gt;</description></item><item><title>Javascript Async Await Tutorial</title><link>https://tutorialedge.net/javascript/javascript-async-await-tutorial/</link><pubDate>Sat, 10 Mar 2018 20:59:31 +0000</pubDate><guid>https://tutorialedge.net/javascript/javascript-async-await-tutorial/</guid><description>&lt;p&gt;In this tutorial, we are going to have a look at how you can make your
JavaScript programs more syntactically beautiful with the use of both the
&lt;code&gt;async&lt;/code&gt; and &lt;code&gt;await&lt;/code&gt; keywords. Both of these keywords were introduced into Node
in version 7.6. Hopefully, by the end of the tutorial, you will be going back to
refactor all of your old NodeJS based applications to replace all of your
chained callbacks and promises.&lt;/p&gt;</description></item><item><title>VueJS fundamentals</title><link>https://tutorialedge.net/course/vuejs/</link><pubDate>Thu, 01 Mar 2018 08:16:15 +0000</pubDate><guid>https://tutorialedge.net/course/vuejs/</guid><description>&lt;h4 id="course-outline"&gt;
 &lt;a href="#course-outline" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Course Outline&lt;/h4&gt;
&lt;p&gt;In the past few months, I have been playing about with VueJS 2 and in all
honesty, I have been seriously loving it. It&amp;rsquo;s a lighter alternative to the
likes of a Angular and it is fleshed out enough to still be very fun and easy to
use.&lt;/p&gt;
&lt;p&gt;In these tutorials, we shall be covering some of the basics of VueJS and how I
managed to overcome some of the key challenges that a lot of frontend
applications face using the framework.&lt;/p&gt;</description></item><item><title>Creating Go Based Lambda Functions in AWS - Tutorial</title><link>https://tutorialedge.net/cloud/aws/creating-go-lambda-functions-tutorial/</link><pubDate>Sun, 21 Jan 2018 11:22:33 +0000</pubDate><guid>https://tutorialedge.net/cloud/aws/creating-go-lambda-functions-tutorial/</guid><description>&lt;p&gt;If you haven&amp;rsquo;t heard already AWS recently announced support for creating AWS
Lambda functions using the Go programming language. As a huge fan of the
language and of AWS itself I thought this would be the perfect opportunity to
combine both and create a simple tutorial on how to create your own Lambda
functions in Go.&lt;/p&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;div style="position:relative;height:0;padding-bottom:42.76%"&gt;&lt;iframe src="https://www.youtube.com/embed/x_yCX4kSchY?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="842" height="360" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id="conclusion"&gt;
 &lt;a href="#conclusion" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;If you found this tutorial useful or require further assistance then please feel
free to let me know in the comments section below! You can also get in touch by
tweeting me &lt;a href="https://twitter.com/elliot_f"
 title="@Elliot_f" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 @Elliot_f&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Working with JSON in Rust - Tutorial</title><link>https://tutorialedge.net/rust/rust-working-with-json-tutorial/</link><pubDate>Mon, 25 Dec 2017 11:51:47 +0000</pubDate><guid>https://tutorialedge.net/rust/rust-working-with-json-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Rust Version: 1.22.1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Most programming languages support &lt;code&gt;JSON&lt;/code&gt; as part of the core language by
default. It&amp;rsquo;s an incredibly popular data format that is used in millions of
different applications.&lt;/p&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at how you can effectively work with JSON
objects within our own Rust based systems. In order to do this we&amp;rsquo;ll be creating
a very simple &lt;a href="./software-eng/what-is-a-rest-api"
 title="REST API" 
 &gt;
 REST API&lt;/a&gt; that will do a variety of
different things with JSON objects.&lt;/p&gt;</description></item><item><title>Data Structures - Sets For Beginners</title><link>https://tutorialedge.net/compsci/data-structures/sets-for-beginners/</link><pubDate>Wed, 20 Dec 2017 22:22:37 +0000</pubDate><guid>https://tutorialedge.net/compsci/data-structures/sets-for-beginners/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Under Construction&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we are going to look at the &lt;code&gt;set&lt;/code&gt; data structure in computer
science and how you can leverage it within your applications. We&amp;rsquo;ll be covering
this concept using the Python programming language.&lt;/p&gt;
&lt;h2 id="sets-in-mathematics"&gt;
 &lt;a href="#sets-in-mathematics" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Sets in Mathematics&lt;/h2&gt;
&lt;p&gt;Understanding Sets and basic Set Theory in Mathematics is a fundamental skill.
The idea of a &lt;em&gt;Set&lt;/em&gt; has been translated directly from mathematics into
programming languages such as Python, and with this Set data structure, comes
some incredibly useful functions such as &lt;code&gt;union()&lt;/code&gt;, &lt;code&gt;issubset()&lt;/code&gt;,
&lt;code&gt;intersection()&lt;/code&gt;, &lt;code&gt;isdisjoint()&lt;/code&gt; that have also been translated directly over
from Mathematics.&lt;/p&gt;</description></item><item><title>Data Structures - Priority Queues For Beginners</title><link>https://tutorialedge.net/compsci/data-structures/priority-queues-for-beginners/</link><pubDate>Wed, 20 Dec 2017 22:22:26 +0000</pubDate><guid>https://tutorialedge.net/compsci/data-structures/priority-queues-for-beginners/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This article uses Python 3.6 in order to demonstrate some of the concepts.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this article we&amp;rsquo;ll be covering &lt;code&gt;Priority Queues&lt;/code&gt; and how they differ from
your standard &lt;code&gt;Queue&lt;/code&gt; data structure.&lt;/p&gt;
&lt;h2 id="why-do-we-need-them"&gt;
 &lt;a href="#why-do-we-need-them" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Do We Need Them?&lt;/h2&gt;
&lt;p&gt;In order to explain this better, let&amp;rsquo;s think about a real-world example where a
normal queueing system may not be the best idea. Let&amp;rsquo;s imagine you were
implementing a queuing system for a hospital&amp;rsquo;s Accident and Emergency ward.&lt;/p&gt;</description></item><item><title>Data Structures - Arrays for Beginners</title><link>https://tutorialedge.net/compsci/data-structures/arrays-for-beginners/</link><pubDate>Wed, 20 Dec 2017 22:03:08 +0000</pubDate><guid>https://tutorialedge.net/compsci/data-structures/arrays-for-beginners/</guid><description>&lt;p&gt;In this article we are going to be looking at the &lt;code&gt;array&lt;/code&gt; data structure. We&amp;rsquo;ll
be looking at some of the fundamental characteristics of the structure and how
we can best leverage this within our own programs.&lt;/p&gt;
&lt;h2 id="intro"&gt;
 &lt;a href="#intro" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Intro&lt;/h2&gt;
&lt;p&gt;Arrays represent a collection of elements, these elements can be of different
types; &lt;code&gt;integers&lt;/code&gt;, &lt;code&gt;characters&lt;/code&gt;, &lt;code&gt;strings&lt;/code&gt;, &lt;code&gt;floating-point values&lt;/code&gt; and even
composite types such as &lt;code&gt;arrays&lt;/code&gt; which allows you to create nested array
structures should you wish, or &lt;code&gt;objects&lt;/code&gt; which are a group of elements all bundled together.&lt;/p&gt;</description></item><item><title>Data Structures - Queues For Beginners</title><link>https://tutorialedge.net/compsci/data-structures/queues-for-beginners/</link><pubDate>Wed, 20 Dec 2017 22:02:47 +0000</pubDate><guid>https://tutorialedge.net/compsci/data-structures/queues-for-beginners/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Under Construction&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we are going to look at the &lt;code&gt;queue&lt;/code&gt; data structure. We&amp;rsquo;ll take
a look at how this data structure can be used for various tasks and the various
sort of things you can do with queues.&lt;/p&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;The &lt;code&gt;queue&lt;/code&gt; data structure is typically used in scenarios where you want things
to be processed in the same order that they were inputted into a system.&lt;/p&gt;</description></item><item><title>Data Structures - Graphs For Beginners</title><link>https://tutorialedge.net/compsci/data-structures/compsci-graphs-for-beginners/</link><pubDate>Wed, 20 Dec 2017 22:02:28 +0000</pubDate><guid>https://tutorialedge.net/compsci/data-structures/compsci-graphs-for-beginners/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Under Construction&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;code&gt;Graphs&lt;/code&gt; and &lt;code&gt;graph traversal&lt;/code&gt; algorithms are a cornerstone of every computer
scientists education. Every reputable university will feature one or more
classes dedicated to this topic and with good reason, the theory covered within
these topics branches into a number of practical uses.&lt;/p&gt;
&lt;p&gt;If you are interested in going into something like Game Development then
&lt;code&gt;graphs&lt;/code&gt; feature pretty heavily.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Game developers typically use algorithms such as the &lt;code&gt;A* search algorithm&lt;/code&gt; in
order to implement basic AI within their games.&lt;/li&gt;
&lt;li&gt;Network Engineers widely use &lt;code&gt;Djikstra's Algorithm&lt;/code&gt; in order to implement
their network routing protocols.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="directed-and-undirected"&gt;
 &lt;a href="#directed-and-undirected" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Directed and Undirected&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Graphs&lt;/code&gt; can come in two distinct flavours; &lt;code&gt;directed&lt;/code&gt; and &lt;code&gt;undirected&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Data Structures - Stacks For Beginners</title><link>https://tutorialedge.net/compsci/data-structures/stacks-for-beginners/</link><pubDate>Wed, 20 Dec 2017 21:29:51 +0000</pubDate><guid>https://tutorialedge.net/compsci/data-structures/stacks-for-beginners/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Under Construction&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial, we are going to be taking a look at stacks in Computer Science
and how they can be used to effectively solve problems that we may face as
software developers.&lt;/p&gt;
&lt;h2 id="stacks---the-theory"&gt;
 &lt;a href="#stacks---the-theory" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Stacks - The Theory&lt;/h2&gt;
&lt;p&gt;I think the best way to imagine the stack data structure is to imagine a stack
of pancakes. Typically, when you add a new pancake, it has to go on to the top
of the existing pile. If you want to conversely eat a pancake from the stack,
you have to pop the top one off and into your mouth.&lt;/p&gt;</description></item><item><title>Python Method Resolution Order Tutorial</title><link>https://tutorialedge.net/python/python-method-resolution-order-tutorial/</link><pubDate>Mon, 18 Dec 2017 11:23:34 +0000</pubDate><guid>https://tutorialedge.net/python/python-method-resolution-order-tutorial/</guid><description>&lt;p&gt;Understanding the way and the order in which Python resolves functions is
important. You need to know where your code is going to call, when you call it
and things can get messy as soon as you start playing with classes inheriting
from multiple other classes.&lt;/p&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at how Python 3 handles its &lt;code&gt;MRO&lt;/code&gt; by using a
little something called &lt;code&gt;C3 Linearization&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="the-problems-with-inheritance"&gt;
 &lt;a href="#the-problems-with-inheritance" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Problems with Inheritance&lt;/h2&gt;
&lt;p&gt;Imagine you were implementing a programming language that featured inheritance.
When you first approach this topic you decide: a child class will have all of
the functions and attributes that it&amp;rsquo;s parent classes should have!&lt;/p&gt;</description></item><item><title>The Top Programming Books for Learning Rust</title><link>https://tutorialedge.net/rust/best-books-for-learning-rust/</link><pubDate>Sun, 17 Dec 2017 15:07:54 +0000</pubDate><guid>https://tutorialedge.net/rust/best-books-for-learning-rust/</guid><description>&lt;!-- TODO: Add 2 more books --&gt;
&lt;p&gt;In this article we will be looking at the best books you can buy to help you
learn the basics of Rust Systems Development.&lt;/p&gt;
&lt;p&gt;Rust is an incredibly fast systems programming language that is used by a very
wide range of large organizations such as &lt;code&gt;mozilla&lt;/code&gt; (the original creators of the
language), &lt;code&gt;Atlassian&lt;/code&gt;, &lt;code&gt;Dropbox&lt;/code&gt; and &lt;code&gt;npm&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="programming-rust-fast-safe-systems-development"&gt;
 &lt;a href="#programming-rust-fast-safe-systems-development" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Programming Rust: Fast, Safe Systems Development&lt;/h2&gt;
&lt;p&gt;&lt;img alt="Programming Rust: Fast, Safe Systems Development" src="https://s3.eu-west-1.amazonaws.com/images.tutorialedge.net/books/programming-rust.jpg" class="book-img" /&gt; Programming Rust: Fast, Safe Systems Development (1st Edition) is a fantastic resource for those of you willing to pick up the relatively new language. The book explains the complexities of the language and how you can ensure your programs are free from things such as null pointer dereferences, double frees, dangling pointers and other such bugs. &lt;/p&gt;</description></item><item><title>Creating Basic Python C Extensions - Tutorial</title><link>https://tutorialedge.net/python/python-c-extensions-tutorial/</link><pubDate>Fri, 01 Dec 2017 21:32:19 +0000</pubDate><guid>https://tutorialedge.net/python/python-c-extensions-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6. The official documentation can be
found here:
&lt;a href="https://docs.python.org/3/extending/index.html"
 title="Extending and Embedding the Python Interpreter" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Extending and Embedding the Python Interpreter&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we are going to take a look at how you can create a really
simple Python module using the &lt;code&gt;C&lt;/code&gt; programming language. I felt this was a good
topic to cover as I personally struggled with finding succinct documentation
that worked and showed me the basics.&lt;/p&gt;</description></item><item><title>An Introduction To Autoscaling Your Website or Service</title><link>https://tutorialedge.net/cloud/an-introduction-to-autoscaling-your-website/</link><pubDate>Thu, 30 Nov 2017 21:21:51 +0000</pubDate><guid>https://tutorialedge.net/cloud/an-introduction-to-autoscaling-your-website/</guid><description>&lt;p&gt;In this article we are going to look at &lt;code&gt;autoscalers&lt;/code&gt;. We are going to look at
how they work and how they can enable your service to dynamically grow and
shrink to cope with variable demands.&lt;/p&gt;
&lt;h2 id="the-scenario"&gt;
 &lt;a href="#the-scenario" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Scenario&lt;/h2&gt;
&lt;p&gt;Imagine the scenario where you write a RESTful API that at first just requires a
single server instance on AWS in order to sustain the initial demand placed on
it. After a couple of weeks somebody who appreciates the your service posts it
on a popular site such as &lt;code&gt;/r/programming&lt;/code&gt; and you see demand double.&lt;/p&gt;</description></item><item><title>How to use Terraform, Go, and AWS to build a scalable and resilient REST API</title><link>https://tutorialedge.net/cloud/build-scalable-rest-api-go-terraform-aws/</link><pubDate>Thu, 30 Nov 2017 21:21:51 +0000</pubDate><guid>https://tutorialedge.net/cloud/build-scalable-rest-api-go-terraform-aws/</guid><description>&lt;p&gt;I&amp;rsquo;ve recently been exploring the power of Terraform - and wanted to apply what I&amp;rsquo;ve learned to build a scalable and resilient REST API. In just a few simple steps, we&amp;rsquo;ll be using Terraform to provision our underlying AWS infrastructure and deploy our microservice developed with Go.
Creating the RESTful API with GO
To get started, let&amp;rsquo;s build and compile a simple codebase using Go. Once we build this microservice, we&amp;rsquo;ll provision an AWS EC2 instance for our execution environment.&lt;/p&gt;</description></item><item><title>Basic Website Resiliency Patterns - Load Balancers</title><link>https://tutorialedge.net/cloud/basic-website-resiliency-load-balancers/</link><pubDate>Wed, 29 Nov 2017 19:48:57 +0000</pubDate><guid>https://tutorialedge.net/cloud/basic-website-resiliency-load-balancers/</guid><description>&lt;p&gt;In this article we are going to be looking at the concept of load balancers.
We&amp;rsquo;ll be discussing what they are and how you can effectively use them to
improve the reliability and resiliency of your websites and REST services and
decrease downtime.&lt;/p&gt;
&lt;h2 id="load-balancers---what-are-they"&gt;
 &lt;a href="#load-balancers---what-are-they" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Load Balancers - What Are They?&lt;/h2&gt;
&lt;p&gt;So the first thing you may be asking is, &amp;ldquo;what is a load balancer?&amp;rdquo;. We&amp;rsquo;ll to
answer your question, load balancers enable us to effectively balance all
incoming traffic/requests to a given website or service across multiple
instances of your website or service.&lt;/p&gt;</description></item><item><title>My Notes for the Certified Kubernetes Application Developer - Part 1, Core Concepts</title><link>https://tutorialedge.net/blog/my-notes-for-certified-kubernetes/</link><pubDate>Wed, 29 Nov 2017 19:48:57 +0000</pubDate><guid>https://tutorialedge.net/blog/my-notes-for-certified-kubernetes/</guid><description>&lt;p&gt;Recently, I’ve started studying for the Certified Kubernetes Application Developer certificate, CKAD for short, and I thought I would share some of the notes I took in an effort to try and pass this certification.
This won’t be a comprehensive view of Kubernetes, but it should give anyone reading it a solid-enough grounding to base their own studies off of. If you find any mistakes here, LET ME KNOW ASAP, as I’m hoping to sit the test in the coming few weeks!
I’m hoping to make this a multi-part series that will cover a fair chunk of the content that might be needed to sit the CKAD exam!&lt;/p&gt;</description></item><item><title>Asyncio Semaphores and Bounded Semaphores Tutorial</title><link>https://tutorialedge.net/python/concurrency/python-asyncio-semaphores-tutorial/</link><pubDate>Fri, 24 Nov 2017 13:39:00 +0000</pubDate><guid>https://tutorialedge.net/python/concurrency/python-asyncio-semaphores-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built on top of Python 3.6.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at &lt;code&gt;semaphores&lt;/code&gt; and &lt;code&gt;bounded-semaphores&lt;/code&gt; and
how they work within the Asyncio framework.&lt;/p&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;div style="position:relative;height:0;padding-bottom:56.3%"&gt;&lt;iframe src="https://www.youtube.com/embed/uvM-JYnz1Mw?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="639" height="360" frameborder="0" gesture="media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id="what-are-semaphores"&gt;
 &lt;a href="#what-are-semaphores" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Are Semaphores?&lt;/h2&gt;
&lt;p&gt;Semaphores were originally a key part of railway system architecture and it was
the famous Dijkstra that translated this real-world concept into our computing
world.&lt;/p&gt;
&lt;p&gt;These semaphores have an internal counter that is incremented and decremented
whenever either an &lt;code&gt;acquire&lt;/code&gt; or a &lt;code&gt;release&lt;/code&gt; call is made.&lt;/p&gt;</description></item><item><title>Asyncio Synchronization Primitives Tutorial - Queues and Locks</title><link>https://tutorialedge.net/python/concurrency/asyncio-synchronization-primitives-tutorial/</link><pubDate>Thu, 23 Nov 2017 19:35:09 +0000</pubDate><guid>https://tutorialedge.net/python/concurrency/asyncio-synchronization-primitives-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built on top of Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;div style="position:relative;height:0;padding-bottom:42.76%"&gt;&lt;iframe src="https://www.youtube.com/embed/kMcwcJdIvHI?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="842" height="360" frameborder="0" gesture="media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at the various synchronization primitives
available to you in your Asyncio programming adventures. We&amp;rsquo;ll be taking a brief
look at why these synchronization primitives are important and also the various
ways you can use them within a simple Asyncio based program.&lt;/p&gt;
&lt;h2 id="why-are-these-important"&gt;
 &lt;a href="#why-are-these-important" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Are These Important?&lt;/h2&gt;
&lt;p&gt;When it comes to programming concurrent systems you have to try and ensure that
your program is free from a little thing called a &lt;code&gt;Race Condition&lt;/code&gt;. A
&lt;code&gt;Race Condition&lt;/code&gt; occurs when multiple concurrent workers try to modify a shared
variable, array etc. concurrently and they start to produce erroneous results
due to timing issues.&lt;/p&gt;</description></item><item><title>Implementing Quicksort in Python</title><link>https://tutorialedge.net/compsci/sorting/quicksort-in-python/</link><pubDate>Mon, 20 Nov 2017 18:09:47 +0000</pubDate><guid>https://tutorialedge.net/compsci/sorting/quicksort-in-python/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial we are going to be looking at how you can implement the QuickSort algorithm using Python.&lt;/strong&gt; This will include looking at how the underlying algorithm works, and the time/space complexity of the algorithm when implemented correctly.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt; - If you are applying for jobs at some of the top tech companies in the world then be aware that this algorithm may feature within their interview processes so it&amp;rsquo;s worthwhile memorizing some of the key information about it.&lt;/p&gt;</description></item><item><title>Implementing Selection Sort in Python</title><link>https://tutorialedge.net/compsci/sorting/selection-sort-in-python/</link><pubDate>Mon, 20 Nov 2017 18:09:47 +0000</pubDate><guid>https://tutorialedge.net/compsci/sorting/selection-sort-in-python/</guid><description>&lt;p&gt;Welcome all! In this tutorial, we are going to be looking at how you can
implement the selection sort in Python!&lt;/p&gt;
&lt;h2 id="theory"&gt;
 &lt;a href="#theory" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Theory&lt;/h2&gt;
&lt;p&gt;How does the selection sorting algorithm work? Well it sorts data by finding the
smallest item and swapping it into the array in the first unsorted location.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It enumerates the array from the first unsorted element to the end&lt;/li&gt;
&lt;li&gt;Identifies the smallest item&lt;/li&gt;
&lt;li&gt;Swaps the smallest item with the first unsorted item&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The selection sorting algorithm typically performs better than the bubble sort
and typically worse than the insertion sorting algorithm.&lt;/p&gt;</description></item><item><title>Getting Started With Tries in Python</title><link>https://tutorialedge.net/compsci/data-structures/getting-started-with-tries-in-python/</link><pubDate>Sun, 19 Nov 2017 17:17:29 +0000</pubDate><guid>https://tutorialedge.net/compsci/data-structures/getting-started-with-tries-in-python/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial uses Python 3.6 in order to convey the concepts that I will be
covering.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;A &lt;code&gt;Trie&lt;/code&gt; in computer science is a tree structure that allows you to do things
such as very quick lookup of words within the english language. Typically if you
were to write a word processor that did spell checks against words in a
document, you would implement a &lt;code&gt;trie&lt;/code&gt; and perform a very quick lookup to check
whether or not the words in your word document are indeed valid words.&lt;/p&gt;</description></item><item><title>Data Structures - Hash Tables For Beginners</title><link>https://tutorialedge.net/compsci/data-structures/hash-tables-for-beginners/</link><pubDate>Sun, 19 Nov 2017 08:57:29 +0000</pubDate><guid>https://tutorialedge.net/compsci/data-structures/hash-tables-for-beginners/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial will use Python 3.6 to convey the concepts covered.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;So, in this tutorial, we are going to be looking at Hash Tables and how they can
be used within our applications for fame and fortune. By the end of this
tutorial, you should have a solid grasp of these Hash Tables and how they work
under the covers.&lt;/p&gt;
&lt;h2 id="an-introduction"&gt;
 &lt;a href="#an-introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;An Introduction&lt;/h2&gt;
&lt;p&gt;So, the first place we should start with is, what are hash tables? Hash Tables
in Computer Science are a data structure that allow you to store key value pairs
in such a way that allows for very quick look-up.&lt;/p&gt;</description></item><item><title>Bit Manipulation For Beginners</title><link>https://tutorialedge.net/compsci/bit-manipulation-for-beginners/</link><pubDate>Sat, 18 Nov 2017 17:42:32 +0000</pubDate><guid>https://tutorialedge.net/compsci/bit-manipulation-for-beginners/</guid><description>&lt;p&gt;In this tutorial we will be taking a look at bit manipulation and how you can
use it to optimize some of the different parts of your systems when you are
programming.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;In this tutorial we will be using Python 3.6 in order to demonstrate some of
the concepts covered.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="shift-left"&gt;
 &lt;a href="#shift-left" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Shift Left&lt;/h2&gt;
&lt;p&gt;By shifting left we are essentially multiplying our original number by 2 * the
number of times we shift left.&lt;/p&gt;</description></item><item><title>Memoization For Beginners</title><link>https://tutorialedge.net/compsci/memoization-for-beginners/</link><pubDate>Sat, 18 Nov 2017 16:10:25 +0000</pubDate><guid>https://tutorialedge.net/compsci/memoization-for-beginners/</guid><description>&lt;p&gt;In this tutorial we are going to look at a concept in computer science called
&lt;code&gt;memoization&lt;/code&gt;. This is a really cool concept that allows us to optimize the
runtime performance of some of our recursive algorithms by effectively caching
the results of previous computations so that they don&amp;rsquo;t have to be continuously
re-computed.&lt;/p&gt;
&lt;h2 id="the-fibonacci-example"&gt;
 &lt;a href="#the-fibonacci-example" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Fibonacci Example&lt;/h2&gt;
&lt;p&gt;Calculating Fibonacci in a recursive manner is quite possibly the best example
I&amp;rsquo;ve come across when it comes to showing the power of &lt;code&gt;memoization&lt;/code&gt;.&lt;/p&gt;</description></item><item><title>Implementing The Insertion Sort Algorithm in Python</title><link>https://tutorialedge.net/compsci/sorting/insertion-sort-in-python/</link><pubDate>Wed, 15 Nov 2017 18:12:50 +0000</pubDate><guid>https://tutorialedge.net/compsci/sorting/insertion-sort-in-python/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we are going to be taking a look at the insertion sorting
algorithm and how it works as well as how you can implement this algorithm in
the Python programming language.&lt;/p&gt;
&lt;h2 id="insertion-sorting"&gt;
 &lt;a href="#insertion-sorting" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Insertion Sorting&lt;/h2&gt;
&lt;p&gt;So the insertion sorting algorithm is a well known sorting algorithm that can
sort an unsorted array in a worst case time of &lt;code&gt;O(N^2)&lt;/code&gt; time. It works by
iterating through an array and sorting elements in a linear fashion.&lt;/p&gt;</description></item><item><title>Implementing The Bubble Sort Algorithm in Python</title><link>https://tutorialedge.net/compsci/sorting/bubble-sort-in-python/</link><pubDate>Wed, 15 Nov 2017 18:10:37 +0000</pubDate><guid>https://tutorialedge.net/compsci/sorting/bubble-sort-in-python/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note -&lt;/strong&gt; This tutorial was built on top of Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we are going to be taking a quick look at the bubble sort
sorting algorithm. This algorithm is another very well known sorting algorithm
that is quite often referenced in technical interviews. It is amongst the worst
performing sorting algorithm with an average and a worst case sorting complexity
of &lt;code&gt;O(N^2)&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;
 &lt;a href="#how-it-works" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;How It Works&lt;/h2&gt;
&lt;p&gt;Bubble sort works by constantly iterating through an unsorted array and swapping
values within that array until such times as no swaps are made within a full
pass through the array.&lt;/p&gt;</description></item><item><title>Asyncio Tasks Tutorial</title><link>https://tutorialedge.net/python/concurrency/asyncio-tasks-tutorial/</link><pubDate>Sat, 11 Nov 2017 13:06:32 +0000</pubDate><guid>https://tutorialedge.net/python/concurrency/asyncio-tasks-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built on top of Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at Tasks in Asyncio. We&amp;rsquo;ll be building on top
of my previous tutorial on
&lt;a href="./python/concurrency/asyncio-event-loops-tutorial/"
 title="Asyncio Event Loops" 
 &gt;
 Asyncio Event Loops&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="tasks"&gt;
 &lt;a href="#tasks" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Tasks&lt;/h2&gt;
&lt;p&gt;Tasks within Asyncio are responsible for the execution of coroutines within an
event loop. These tasks can only run in one event loop at one time and in order
to achieve parallel execution you would have to run multiple event loops over
multiple threads.&lt;/p&gt;</description></item><item><title>An Introduction to Face Recognition in Python</title><link>https://tutorialedge.net/python/intro-face-recognition-in-python/</link><pubDate>Sun, 05 Nov 2017 17:42:45 +0000</pubDate><guid>https://tutorialedge.net/python/intro-face-recognition-in-python/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was written with Python 3.6, however the library used is
compatible with versions 3.3 and above.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Face recognition software is awesome. The fact that we are able to write
software that accurately picks out where someone&amp;rsquo;s eyes and nose reside within
an image still astounds me and the fact that there are libraries out there for
this sort of things is awesome. These libraries help to lower the barrier to
entry for beginners looking to write their own face recognition systems and
allow people to do some really cool things.&lt;/p&gt;</description></item><item><title>Getting Started with Asyncio in Python</title><link>https://tutorialedge.net/python/concurrency/getting-started-with-asyncio-python/</link><pubDate>Sat, 04 Nov 2017 15:20:50 +0000</pubDate><guid>https://tutorialedge.net/python/concurrency/getting-started-with-asyncio-python/</guid><description>&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;div style="position:relative;height:0;padding-bottom:56.3%"&gt;&lt;iframe src="https://www.youtube.com/embed/L3RyxVOLjz8?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="639" height="360" frameborder="0" gesture="media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;This tutorial was written on top of Python 3.6. This is taken from my book
&lt;a href="https://www.packtpub.com/application-development/learning-concurrency-python"
 title="&amp;ldquo;Learning Concurrency in Python&amp;rdquo;" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 &amp;ldquo;Learning Concurrency in Python&amp;rdquo;&lt;/a&gt;
if you wish to read up more on the library.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Asyncio became part of the Python ecosystem in version 3.4 and has since then
become the basis for a huge number of Python libraries and frameworks due to
it&amp;rsquo;s impressive speed and ease of use. Asyncio allows you to easily write
single-threaded concurrent programs that utilize something called coroutines,
these coroutines are like a stripped down threads and don&amp;rsquo;t come with the same
inherit performance issues that your full-fat threads would typically come with.&lt;/p&gt;</description></item><item><title>Threads in Python</title><link>https://tutorialedge.net/python/concurrency/threads-in-python/</link><pubDate>Tue, 31 Oct 2017 22:00:56 +0000</pubDate><guid>https://tutorialedge.net/python/concurrency/threads-in-python/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was written using Python 3.6. Some of the code may not be
compatible with Python 2.7&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we are going to take an in-depth look at threads in Python.
We&amp;rsquo;ll start by covering what they consist of, we&amp;rsquo;ll then touch upon how you can
define your own simple threads within your Python programs and finally we&amp;rsquo;ll
cover all of the ways you can work with these simple threads within a simple
Python program.&lt;/p&gt;</description></item><item><title>Asyncio Event Loops Tutorial</title><link>https://tutorialedge.net/python/concurrency/asyncio-event-loops-tutorial/</link><pubDate>Sat, 28 Oct 2017 11:50:27 +0100</pubDate><guid>https://tutorialedge.net/python/concurrency/asyncio-event-loops-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built on top of Python 3.6.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we are going to be covering Asyncio&amp;rsquo;s event loop. Some of the
material for this tutorial was taken from my book:
&lt;a href="https://www.packtpub.com/application-development/learning-concurrency-python"
 title="Learning Concurrency in Python" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Learning Concurrency in Python&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="video"&gt;
 &lt;a href="#video" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video&lt;/h2&gt;
&lt;div style="position:relative;height:0;padding-bottom:56.25%"&gt;&lt;iframe src="https://www.youtube.com/embed/xWt5lpn8fN8?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="640" height="360" frameborder="0" gesture="media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id="the-event-loop"&gt;
 &lt;a href="#the-event-loop" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Event Loop&lt;/h2&gt;
&lt;p&gt;The main component of any asyncio based Python program has to be the underlying
event loop. Within this event loop we can (from the official documentation):&lt;/p&gt;</description></item><item><title>Creating a RESTful API with Python and aiohttp</title><link>https://tutorialedge.net/python/create-rest-api-python-aiohttp/</link><pubDate>Sat, 28 Oct 2017 11:50:27 +0100</pubDate><guid>https://tutorialedge.net/python/create-rest-api-python-aiohttp/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built on top of Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be building a very simple RESTful based API using
&lt;a href="https://github.com/aio-libs/aiohttp"
 title="aio-libs/aiohttp" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 aio-libs/aiohttp&lt;/a&gt; which is an asynchronous
http client/server framework.&lt;/p&gt;
&lt;h2 id="getting-started-with-aiohttp"&gt;
 &lt;a href="#getting-started-with-aiohttp" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Getting Started with aiohttp&lt;/h2&gt;
&lt;p&gt;Before we go into how we can use aiohttp to create a simple RESTful API, it&amp;rsquo;s
important to know exactly what the framework is and what it can do for us. To
start with, it features excellent support of the HTTP protocol as well as for
websockets which makes it ideal for working with popular websocket libraries
such as Socket.io. If you are interested in seeing how to implement a simple
client/server socketio based solution check out this tutorial:
&lt;a href="./python/python-socket-io-tutorial/"
 title="Python Socket.io with aiohttp Tutorial" 
 &gt;
 Python Socket.io with aiohttp Tutorial&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Python Event-Driven Programming with RxPY - Tutorial</title><link>https://tutorialedge.net/python/python-event-driven-rxpy-tutorial/</link><pubDate>Sat, 14 Oct 2017 11:30:25 +0100</pubDate><guid>https://tutorialedge.net/python/python-event-driven-rxpy-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The reactive programming paradigm is something that I&amp;rsquo;ve always been interested
in upon learning about them when working with RxJS in my Angular 2+ based
projects.&lt;/p&gt;
&lt;p&gt;Event based systems can dynamically react to different situations in smart ways
and the &lt;a href="https://github.com/ReactiveX"
 title="ReactiveX" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 ReactiveX&lt;/a&gt; library enables to do this in
a such a way that our code is succinct and easy to follow.&lt;/p&gt;
&lt;h2 id="differences-between-reactive-and-event-driven-programming"&gt;
 &lt;a href="#differences-between-reactive-and-event-driven-programming" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Differences between Reactive and Event-Driven Programming&lt;/h2&gt;
&lt;p&gt;It should be noted that there are some subtle differences between both
event-driven programming and that of reactive programming. Event-driven
programming focuses on handling events such as, for example, a button click and
is the paradigm that most operating systems are based upon. If you perform an
action within an operating system, the &lt;code&gt;os&lt;/code&gt; will treat that as an event and
trigger the corresponding function for that action.&lt;/p&gt;</description></item><item><title>Angular Query Parameters Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-query-params-tutorial/</link><pubDate>Mon, 02 Oct 2017 19:47:19 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-query-params-tutorial/</guid><description>&lt;p&gt;In this tutorial we are going to be taking a look at how you can extract
information from query parameters from within your application&amp;rsquo;s URL and
subsequently utilize this information in your Angular based application.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This assumes that you have already implemented routing within your Angular
application. If you require further assistance with this then please feel free
to check out my tutorial on
&lt;a href="./typescript/angular/angular-routing-tutorial/"
 title="Angular Routing" 
 &gt;
 Angular Routing&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="what-are-query-parameters"&gt;
 &lt;a href="#what-are-query-parameters" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Are Query Parameters?&lt;/h2&gt;
&lt;p&gt;Query Parameters or &lt;code&gt;query strings&lt;/code&gt; as they are otherwise known enable us to
pass in information to an application through the URL that we use to open said
application. Imagine you were writing a social media application that feature
hundreds of users. If you had a page that allowed you to view information on a
single, specific user, you would typically pass in some form of identifier in
your URL to let your application known which user to display. For example:&lt;/p&gt;</description></item><item><title>Python ProcessPoolExecutor Tutorial</title><link>https://tutorialedge.net/python/concurrency/python-processpoolexecutor-tutorial/</link><pubDate>Sun, 01 Oct 2017 13:52:59 +0100</pubDate><guid>https://tutorialedge.net/python/concurrency/python-processpoolexecutor-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial has been taken and adapted from my book:
&lt;a href="https://www.packtpub.com/application-development/learning-concurrency-python"
 title="Learning Concurrency in Python" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Learning Concurrency in Python&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;div style="position:relative;height:0;padding-bottom:56.3%"&gt;&lt;iframe src="https://www.youtube.com/embed/J7w_G6ZKzz4?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="639" height="360" frameborder="0" gesture="media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;In this tutorial we will be looking at how you can utilize multiple processors
within your Python Programs.&lt;/p&gt;
&lt;h2 id="multiprocessing-vs-multithreading"&gt;
 &lt;a href="#multiprocessing-vs-multithreading" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Multiprocessing vs Multithreading&lt;/h2&gt;
&lt;p&gt;Knowing when and where to use multiple threads vs multiple processes is
incredibly important if you are going to be working on highly performant Python
programs. Misuse of either threads or processes could lead to your systems
actually seeing performance degradation.&lt;/p&gt;</description></item><item><title>Python ThreadPoolExecutor Tutorial</title><link>https://tutorialedge.net/python/concurrency/python-threadpoolexecutor-tutorial/</link><pubDate>Sun, 01 Oct 2017 13:36:48 +0100</pubDate><guid>https://tutorialedge.net/python/concurrency/python-threadpoolexecutor-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial has been taken and adapted from my book:
&lt;a href="https://www.packtpub.com/application-development/learning-concurrency-python"
 title="Learning Concurrency in Python" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Learning Concurrency in Python&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at Python&amp;rsquo;s ThreadPoolExecutor. This was
originally introduced into the language in version 3.2 and provides a simple
high-level interface for asynchronously executing input/output bound tasks.&lt;/p&gt;
&lt;h2 id="why-use-a-threadpoolexecutor"&gt;
 &lt;a href="#why-use-a-threadpoolexecutor" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Why Use a ThreadPoolExecutor?&lt;/h2&gt;
&lt;p&gt;ThreadPoolExecutors provide a simple abstraction around spinning up multiple
threads and using these threads to perform tasks in a concurrent fashion. Adding
threading to your application can help to drastically improve the speed of your
application when used in the right context. By using multiple threads we can
speed up applications which face an input/output based bottleneck, a good
example of this would be a web crawler.&lt;/p&gt;</description></item><item><title>Python Socket.io Tutorial</title><link>https://tutorialedge.net/python/python-socket-io-tutorial/</link><pubDate>Sun, 01 Oct 2017 12:22:11 +0100</pubDate><guid>https://tutorialedge.net/python/python-socket-io-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Last Updated&lt;/strong&gt; December 22nd, 2018 &lt;br/&gt;&lt;br/&gt; This tutorial was written
using &lt;strong&gt;Python 3.6&lt;/strong&gt;. Some of the code used is not compatible with version 2.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be exploring how one can create a socket.io based
webserver in Python using the &lt;code&gt;socketio&lt;/code&gt; module.&lt;/p&gt;
&lt;h2 id="what-are-websockets"&gt;
 &lt;a href="#what-are-websockets" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What are WebSockets?&lt;/h2&gt;
&lt;p&gt;WebSockets are an awesome bit of technology which enable us to do cool things
such as perform real time communication between both a client and a server. They
allow you to perform full-duplex communication over a single TCP connection and
remove the need for clients to constantly poll API endpoints for updates or new
content. Clients can create a single connection to a WebSocket server and simply
listen for new events or messages from the server.&lt;/p&gt;</description></item><item><title>The Best Books For Learning Vue.js</title><link>https://tutorialedge.net/javascript/vuejs/best-books-learning-vuejs/</link><pubDate>Mon, 11 Sep 2017 20:00:19 +0100</pubDate><guid>https://tutorialedge.net/javascript/vuejs/best-books-learning-vuejs/</guid><description>&lt;p&gt;&lt;a href="https://vuejs.org/"
 title="Vue.js" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Vue.js&lt;/a&gt; is a fantastic lightweight javascript framework
that is ideal for building user interfaces in an incremental fashion. This means
you don&amp;rsquo;t need to start with a heavy full-fledged framework for what could be a
small side-project.&lt;/p&gt;
&lt;p&gt;If you have followed the site for some time you will know that I&amp;rsquo;ve been a major
fan of AngularJS and then Angular 2-4 in the early days and in fairness I have
only just started to scratch the surface of Vue.js and how it can be used within
my dynamic, real-time applications. In this article I&amp;rsquo;ll be showcasing some of
the best books you can buy in order to learn the ins-and-outs of the Vue.js
framework.&lt;/p&gt;</description></item><item><title>The Best Books For Learning React and React Native</title><link>https://tutorialedge.net/react/best-books-for-learning-react/</link><pubDate>Mon, 11 Sep 2017 18:53:10 +0100</pubDate><guid>https://tutorialedge.net/react/best-books-for-learning-react/</guid><description>&lt;!-- TODO: Flesh out the book descriptions --&gt;
&lt;p&gt;React is without a doubt one of the most popular frontend programming frameworks out at the moment. It features an absolutely incredible online community and a massive range of books and learning resources from which you can learn how to build your own production-ready applications using the framework.&lt;/p&gt;
&lt;p&gt;In this list, we will attempt to filter out some of the top books you can purchase if you wish to learn React for your own projects.&lt;/p&gt;</description></item><item><title>Python Environment Configuration Tutorial</title><link>https://tutorialedge.net/python/python-environment-configuration-tutorial/</link><pubDate>Sun, 10 Sep 2017 14:01:28 +0100</pubDate><guid>https://tutorialedge.net/python/python-environment-configuration-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was written using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Defining a solid strategy for handling various environment configuration in your
Python programs can drastically improve the way you deploy and manage different
environments.&lt;/p&gt;
&lt;p&gt;In the most basic of scenarios we would typically have 2 main environments,
&lt;code&gt;development&lt;/code&gt; and &lt;code&gt;production&lt;/code&gt;. In our development environment we would do both
our development and testing against the likes of non-production based databases
and resources in order to prevent adding noise to our &lt;code&gt;production&lt;/code&gt; environment.&lt;/p&gt;</description></item><item><title>Making HTTP Requests in Python - Tutorial</title><link>https://tutorialedge.net/python/python-http-requests-tutorial/</link><pubDate>Sun, 10 Sep 2017 12:27:56 +0100</pubDate><guid>https://tutorialedge.net/python/python-http-requests-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This Tutorial was built using Python 3.6 and the
&lt;a href="http://docs.python-requests.org/en/master/"
 title="Requests" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Requests&lt;/a&gt; library&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Being able to interact with &lt;code&gt;HTTP&lt;/code&gt; based RESTful APIs is an incredibly important
task for any Python developer. More and more developers are starting to build
their systems our of numerous microservices and often they will expose &lt;code&gt;HTTP&lt;/code&gt;
based endpoints with which we can interact in our own Python programs. In this
tutorial we&amp;rsquo;ll look at the various ways we can interact with a &lt;code&gt;HTTP&lt;/code&gt; based API
using the &lt;a href="http://docs.python-requests.org/en/master/"
 title="Requests" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Requests&lt;/a&gt; library in
Python.&lt;/p&gt;</description></item><item><title>The Best Books for Learning JavaScript</title><link>https://tutorialedge.net/javascript/best-books-learning-javascript/</link><pubDate>Tue, 05 Sep 2017 19:20:04 +0100</pubDate><guid>https://tutorialedge.net/javascript/best-books-learning-javascript/</guid><description>&lt;blockquote&gt;
&lt;p&gt;Under Construction&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="javascript-the-good-parts"&gt;
 &lt;a href="#javascript-the-good-parts" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;JavaScript: The Good Parts&lt;/h2&gt;
&lt;p&gt;&lt;img src="https://s3.eu-west-1.amazonaws.com/images.tutorialedge.net/books/javascript-good-parts.jpg" alt="best books for learning JavaScript" class="book-img"/&gt; Douglas Crockford is one of the most prominent experts in the field of JavaScript by many in the development community and his book JavaScript: The Good Parts is an excellent addition to any JavaScript developers library. The book goes over some of the best parts of the JavaScript language and is exceptionally well written. &lt;/p&gt;
&lt;p&gt;With an average review of 4.4 out of 5 stars on Amazon, this is definitely a
safe purchase for those wanting to master the art of JavaScript programming and
create absolutely beautiful software systems. This book coupled with the next
book, JavaScript: The Definitive Guide are a perfect combination and I would
highly recommend both books in conjunction to anyone wishing to pick the
language up.&lt;/p&gt;</description></item><item><title>The Best Books For Learning Game Development</title><link>https://tutorialedge.net/gamedev/best-books-learn-game-dev/</link><pubDate>Tue, 05 Sep 2017 18:09:42 +0100</pubDate><guid>https://tutorialedge.net/gamedev/best-books-learn-game-dev/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This list is currently under construction&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this article we will be looking at some of the best and most popular books
you can buy should you wish to learn more about the art of game development.&lt;/p&gt;
&lt;p&gt;Game development as a whole is quite a fragmented field, there are a wide number
of game engines such as Unity and Unreal which abstract away the complexities of
things like graphics rendering and physics engines and allow game developers to
focus purely on game-play mechanics. In this guide however we shall be looking
at the more low-level books which don&amp;rsquo;t rely on one of these game engines.&lt;/p&gt;</description></item><item><title>The Best Books for Learning Web Development</title><link>https://tutorialedge.net/webdev/best-book-learn-web-dev/</link><pubDate>Tue, 05 Sep 2017 18:07:38 +0100</pubDate><guid>https://tutorialedge.net/webdev/best-book-learn-web-dev/</guid><description>&lt;p&gt;In this article we are going to be taking a look at some of the best books you
can buy if you are interested in learning more about the art of web development.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This list isn&amp;rsquo;t an exhaustive list of all the best books currently available,
it&amp;rsquo;s just a small list of books I feel are excellent at teaching the basics.
If you have any you would like to add then please let me know in the comments
section.&lt;/p&gt;</description></item><item><title>The Best Books For Learning Go</title><link>https://tutorialedge.net/golang/top-books-for-learning-golang/</link><pubDate>Mon, 12 Jun 2017 21:29:27 +0100</pubDate><guid>https://tutorialedge.net/golang/top-books-for-learning-golang/</guid><description>&lt;p&gt;Go is a language that has drastically grown in popularity over the past few
years. We&amp;rsquo;ve seen companies such as HashiCorp adopt it as their primary language
of choice for all of their projects and with good reason. It&amp;rsquo;s undoubtedly an
absolutely fantastic language to develop with.&lt;/p&gt;
&lt;p&gt;Getting started with Go is relatively straightforward and its syntax and
language structure make it easy to adopt as your primary development language.&lt;/p&gt;</description></item><item><title>Hugo Adding Images To Markdown Posts</title><link>https://tutorialedge.net/golang/hugo/hugo-adding-images-to-posts/</link><pubDate>Mon, 12 Jun 2017 08:49:04 +0100</pubDate><guid>https://tutorialedge.net/golang/hugo/hugo-adding-images-to-posts/</guid><description>&lt;p&gt;In this quick tutorial we are going to look at the various ways you can add
images to your markdown content in hugo.&lt;/p&gt;
&lt;h2 id="markdown-annotation"&gt;
 &lt;a href="#markdown-annotation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Markdown Annotation&lt;/h2&gt;
&lt;p&gt;The quickest and simplest way of adding images to your content would be to use
markdown annotation. Place the image you want to display in your post within
your &lt;code&gt;static/&lt;/code&gt; directory and then reference it in your markdown like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-md" data-lang="md"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;![&lt;span style="color:#81a1c1"&gt;image alt text&lt;/span&gt;](&lt;span style="color:#8fbcbb"&gt;/my_image.png&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="using-html-tags"&gt;
 &lt;a href="#using-html-tags" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Using HTML Tags&lt;/h2&gt;
&lt;p&gt;In the situation where you need to add say a custom css class to the image then
your second option is to simply use an &lt;code&gt;&amp;lt;img/&amp;gt;&lt;/code&gt; tag within your markdown
content. Hugo is smart in the sense that it will automatically include html
content within your markdown content without modifying it.&lt;/p&gt;</description></item><item><title>Hugo Deployment Workflow Tutorial</title><link>https://tutorialedge.net/golang/hugo/hugo-deployment-workflow-tutorial/</link><pubDate>Mon, 12 Jun 2017 08:48:26 +0100</pubDate><guid>https://tutorialedge.net/golang/hugo/hugo-deployment-workflow-tutorial/</guid><description>&lt;p&gt;When developing websites with Hugo, having a solid automated deployment strategy
can save you hundreds of hours of performing repetitive manual tasks. If you&amp;rsquo;re
brand new to the framework, our &lt;a href="./golang/hugo/getting-started-with-hugo/"
 title="Getting Started With Hugo" 
 &gt;
 Getting Started With Hugo&lt;/a&gt;
tutorial covers the fundamentals before you automate your deployments. This site
itself uses hugo and an automated deployment strategy in order to automatically
deploy any changes made to it&amp;rsquo;s underlying git repo:
&lt;a href="https://github.com/elliotforbes/tutorialedge.net"
 title="elliotforbes/tutorialedge.net" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 elliotforbes/tutorialedge.net&lt;/a&gt;.
Whenever I wish to make a change to any of the content on my site I follow these
steps:&lt;/p&gt;</description></item><item><title>Getting Started With Hugo</title><link>https://tutorialedge.net/golang/hugo/getting-started-with-hugo/</link><pubDate>Sat, 27 May 2017 11:13:46 +0100</pubDate><guid>https://tutorialedge.net/golang/hugo/getting-started-with-hugo/</guid><description>&lt;p&gt;Hugo is an incredibly popular static site generator written primarily in Go and
it is currently running this site. With Hugo you would typically define all of
your content in the form of markdown files. These markdown files are then parsed
and combined with a number of template files and you are left with a fully
functioning html page that you can easily host anywhere. There are a number of
key advantages to this approach such as:&lt;/p&gt;</description></item><item><title>The Difference Between Class Selectors and ID Selectors in CSS</title><link>https://tutorialedge.net/webdev/difference-between-class-id-selector-css/</link><pubDate>Sun, 23 Apr 2017 14:48:20 +0100</pubDate><guid>https://tutorialedge.net/webdev/difference-between-class-id-selector-css/</guid><description>&lt;p&gt;If you are new to CSS then you&amp;rsquo;ll probably have noticed that some rules have
selectors that start with &lt;code&gt;#&lt;/code&gt; and some that start with &lt;code&gt;.&lt;/code&gt; and even some that
have none at all. The difference between the two is that the &lt;code&gt;#&lt;/code&gt; rule is an id
selector and the &lt;code&gt;.&lt;/code&gt; is a class selector.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;.&lt;/code&gt; - is a class selector that target elements with the correct &lt;code&gt;class&lt;/code&gt;
attribute.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#&lt;/code&gt; - is an id selector that styles the element with the specified &lt;code&gt;id&lt;/code&gt;
attribute.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;When I was initially learning HTML and CSS I was hit by this stumbling block a
number of times and knowing this distinction between class selectors and id
selectors can save you a lot of time.&lt;/p&gt;</description></item><item><title>How To Work With CSS3 Variables</title><link>https://tutorialedge.net/webdev/how-to-work-with-css3-variables/</link><pubDate>Fri, 21 Apr 2017 19:53:46 +0100</pubDate><guid>https://tutorialedge.net/webdev/how-to-work-with-css3-variables/</guid><description>&lt;p&gt;One of the main reasons that preprocessors like &lt;a href="http://sass-lang.com/"
 title="SASS" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 SASS&lt;/a&gt;
and &lt;a href="http://lesscss.org/"
 title="LESS" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 LESS&lt;/a&gt; have gained such huge popularity over the years
is the fact that the help to bring order to your convoluted and messy CSS files.
I&amp;rsquo;ve found myself too often ending up with 1,000 line css files where the header
specific rules have migrated south towards the end of the document. With
preprocessors you were able to leverage things like inheritance and it actually
gave you a reason to structure your code in a cohesive format.&lt;/p&gt;</description></item><item><title>CSS3 Border Radius Tutorial</title><link>https://tutorialedge.net/webdev/border-radius-tutorial/</link><pubDate>Thu, 20 Apr 2017 08:06:37 +0100</pubDate><guid>https://tutorialedge.net/webdev/border-radius-tutorial/</guid><description>&lt;p&gt;Effective use of border-radius on some elements can remove the harshness of the
square corners on some components.&lt;/p&gt;
&lt;h2 id="circle-element"&gt;
 &lt;a href="#circle-element" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Circle Element&lt;/h2&gt;
&lt;p&gt;In this example we&amp;rsquo;ll be creating a completely round circle object using nothing
but css3. This is what our finished item will look like:&lt;/p&gt;
&lt;div class="circle"&gt;
&lt;/div&gt;
&lt;style&gt;
.circle {
 width: 100px;
 height: 100px;
 border-radius: 100%;
 background-color: #074E68;
 margin: auto;
}
&lt;/style&gt;
&lt;h2 id="source-code"&gt;
 &lt;a href="#source-code" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Source Code&lt;/h2&gt;
&lt;p&gt;To get this to work, what I&amp;rsquo;ve done is create a &lt;code&gt;div&lt;/code&gt; and attached the &lt;code&gt;.circle&lt;/code&gt;
class to that div. I&amp;rsquo;ve then defined this &lt;code&gt;.circle&lt;/code&gt; within my css file and given
it a height and width of 100px. I&amp;rsquo;ve then added &lt;code&gt;border-radius:100%;&lt;/code&gt; to this
class which gives it the shape of a perfect circle.&lt;/p&gt;</description></item><item><title>CSS3 Box Shadow Tutorial</title><link>https://tutorialedge.net/webdev/css3-box-shadow/</link><pubDate>Sun, 16 Apr 2017 16:50:07 +0100</pubDate><guid>https://tutorialedge.net/webdev/css3-box-shadow/</guid><description>&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at how you can add a box shadow effect to
elements of your website. Box shadow can help turn elements of your website from
flat structures to almost 3D like.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;It&amp;rsquo;s worth checking out the material design documentation on
&lt;a href="https://material.io/guidelines/material-design/elevation-shadows.html"
 title="Elevation and Shadows" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Elevation and Shadows&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="output"&gt;
 &lt;a href="#output" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Output&lt;/h2&gt;
&lt;p&gt;This is what we&amp;rsquo;ll be creating:&lt;/p&gt;
&lt;div class="box"&gt;
 &lt;h2&gt;Box Shadow Example&lt;/h2&gt;
&lt;/div&gt;
&lt;style&gt;
.box {
 box-shadow: 0px 0px 15px #888888;
 padding: 20px;
 margin: auto;
 width: 50%;
}
&lt;/style&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;For the above example we first define a div and attach the &lt;code&gt;.box&lt;/code&gt; class to that
div.&lt;/p&gt;</description></item><item><title>AngularJS Promises Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-promises-tutorial/</link><pubDate>Sat, 15 Apr 2017 14:41:31 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-promises-tutorial/</guid><description>&lt;p&gt;In this tutorial we&amp;rsquo;ll be looking at how to work with and define promises in
AngularJS. For more information check out the official
&lt;a href="https://docs.angularjs.org/api/ng/service/$q"
 title="AngularJS Documentation" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 AngularJS Documentation&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="what-are-promises-in-javascript"&gt;
 &lt;a href="#what-are-promises-in-javascript" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What are Promises in Javascript?&lt;/h2&gt;
&lt;p&gt;Essentially when you create a promise, you are ensuring that a certain order is
followed in the execution of your code. Javascript is asynchronous by nature and
in the execution of a method it’s not guaranteed what part of it will finish
execution first. This is a big change if you are used to languages like Java and
C++ where the order of execution is always exactly the same.&lt;/p&gt;</description></item><item><title>Most Important Changes to AngularJS in 1.6</title><link>https://tutorialedge.net/javascript/angularjs/most-important-changes-angularjs-1-6/</link><pubDate>Sat, 15 Apr 2017 14:31:36 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/most-important-changes-angularjs-1-6/</guid><description>&lt;div class="github-link"&gt;The changelog with the AngularJS 1.6 release notes can be found here: &lt;a href="https://github.com/angular/angular.js/blob/master/CHANGELOG.md"&gt;AngularJS 1.6-RC.0&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;After having a look at the AngularJS release notes for 1.6, I thought I’d
compile my thoughts together as to the most important changes to the framework
in the coming release.&lt;/p&gt;
&lt;h2 id="expression-sandbox-removal"&gt;
 &lt;a href="#expression-sandbox-removal" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Expression Sandbox Removal&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://angularjs.blogspot.co.uk/2016/09/angular-16-expression-sandbox-removal.html"
 title="Expression Sandbox Removal Full Notes" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Expression Sandbox Removal Full Notes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The expression sandbox removal was essentially something that checked to see if
your code was accidentally accessing arbitrary javascript and discourage you
from placing any business logic inside your templates.&lt;/p&gt;</description></item><item><title>Python Multithreading Tutorial - Concurrent Programming</title><link>https://tutorialedge.net/python/python-multithreading-tutorial/</link><pubDate>Sat, 15 Apr 2017 09:55:57 +0100</pubDate><guid>https://tutorialedge.net/python/python-multithreading-tutorial/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial, we are going to be looking at how you you can use multithreading&lt;/strong&gt; within your Python applications.&lt;/p&gt;
&lt;h2 id="what-is-multithreading"&gt;
 &lt;a href="#what-is-multithreading" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is Multithreading?&lt;/h2&gt;
&lt;p&gt;Modern computers tend to feature a CPU that has multiple processing cores, each
of these cores can run many threads simultaneously which gives us the ability to
perform several tasks concurrently. This tutorial will hopefully show you how to
get started with Python&amp;rsquo;s &lt;code&gt;threading&lt;/code&gt; module.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Objectives:&lt;/strong&gt;&lt;/p&gt;</description></item><item><title>What is a RESTful API?</title><link>https://tutorialedge.net/software-eng/what-is-a-rest-api/</link><pubDate>Sat, 15 Apr 2017 09:53:07 +0100</pubDate><guid>https://tutorialedge.net/software-eng/what-is-a-rest-api/</guid><description>&lt;p&gt;As a developer I spend a lot of time developing new or improving on existing
RESTful APIs and one of the big questions I’ve been asked is - What is a REST
API?&lt;/p&gt;
&lt;p&gt;This tutorial will try to explain in layman’s terms what a REST API is and how
we can utilize these APIs in order to build our own systems.&lt;/p&gt;
&lt;h2 id="rest-basics"&gt;
 &lt;a href="#rest-basics" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;REST Basics&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;REST&lt;/strong&gt; - Representational State Transfer.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;API&lt;/strong&gt; - Application Programming Interface&lt;/p&gt;</description></item><item><title>UDP Client and Server Tutorial in Python</title><link>https://tutorialedge.net/python/udp-client-server-python/</link><pubDate>Sat, 15 Apr 2017 09:49:35 +0100</pubDate><guid>https://tutorialedge.net/python/udp-client-server-python/</guid><description>&lt;p&gt;In this tutorial I'll be showing you exactly how you can set up your own UDP chat server using CPython 3.3 and Python's Socket module. The end product will be a server that listens for all connections and messages over a specific port and prints out any messages to the console. This could be extended in the future to create a chat server that subsequently broadcasts any messages received to all parties listening for responses.&lt;/p&gt;</description></item><item><title>Calculating Keyword Density of a Web Page with Python</title><link>https://tutorialedge.net/python/calculating-keyword-density-python/</link><pubDate>Sat, 15 Apr 2017 09:47:55 +0100</pubDate><guid>https://tutorialedge.net/python/calculating-keyword-density-python/</guid><description>&lt;p&gt;In this tutorial I will be showing you how to calculate the keyword density of a
web page using the Python programming language. This will be a continuation of
the previous tutorial in which we retrieved a web page using Pythons &lt;code&gt;urllib2&lt;/code&gt;
Python module.&lt;/p&gt;
&lt;h2 id="keyword-density-calculation"&gt;
 &lt;a href="#keyword-density-calculation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Keyword Density Calculation&lt;/h2&gt;
&lt;p&gt;Keyword density is an easy metric to calculate as it has a relatively simple formula. The keyword density of a specific term is measured as the number of occurrences of the chosen keyword over the total number of words in the body of text.&lt;/p&gt;</description></item><item><title>Fetching Web Pages In Python Using Urllib2</title><link>https://tutorialedge.net/python/fetching-web-pages-python/</link><pubDate>Sat, 15 Apr 2017 09:47:01 +0100</pubDate><guid>https://tutorialedge.net/python/fetching-web-pages-python/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 2.7. This will not work for Python 3+&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial I will be showing you how you can fetch the a webpage using the
&lt;code&gt;urllib2&lt;/code&gt; python module. This is a relatively simple process that can be
accomplished in 5 lines of code.&lt;/p&gt;
&lt;h2 id="the-imports"&gt;
 &lt;a href="#the-imports" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Imports&lt;/h2&gt;
&lt;p&gt;To begin with we will need to import the &lt;code&gt;urllib2&lt;/code&gt; python module so that we can
utilize it&amp;rsquo;s functionality:&lt;/p&gt;</description></item><item><title>Creating a Python Web Crawler</title><link>https://tutorialedge.net/python/creating-python-web-crawler/</link><pubDate>Sat, 15 Apr 2017 09:45:44 +0100</pubDate><guid>https://tutorialedge.net/python/creating-python-web-crawler/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Python 3.6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we&amp;rsquo;ll be taking a look at how you can build your own Python web
crawler using the ThreadPoolExecutor class and BeautifulSoup.&lt;/p&gt;
&lt;p&gt;Web Crawlers are incredibly interesting in the sense that they can do a huge
host of data mining tasks. You could for instance do any of the following:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Crawl and entire website for broken links, or errors&lt;/li&gt;
&lt;li&gt;Scrape an entire site to get a collective view of the entire site&lt;/li&gt;
&lt;li&gt;Scrape hundreds of different sites in order to build your own simple search
engine&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The possibilities are truly endless.&lt;/p&gt;</description></item><item><title>Creating a Twitter Bot Using Python and the Twitter API</title><link>https://tutorialedge.net/python/creating-twitter-bot-python/</link><pubDate>Sat, 15 Apr 2017 09:45:44 +0100</pubDate><guid>https://tutorialedge.net/python/creating-twitter-bot-python/</guid><description>&lt;p&gt;Twitter bots are a fantastic way to drum up a bit of interest in your brand or
website and I&amp;rsquo;ve had fantastic results myself building up an audience for the
Twitter account specifically for this website. This tutorial will hopefully
cover everything it takes to construct your own twitter bot that utilizes the
RESTful Twitter API.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The source code for this Python wrapper for the Twitter API can be found here:
&lt;a href="https://github.com/bear/python-twitter"&gt;Github: Bear&amp;rsquo;s Python-Twitter
Wrapper&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Removing HTML Tags from a String with Python</title><link>https://tutorialedge.net/python/removing-html-from-string/</link><pubDate>Sat, 15 Apr 2017 09:38:07 +0100</pubDate><guid>https://tutorialedge.net/python/removing-html-from-string/</guid><description>&lt;p&gt;This tutorial will demonstrate two different methods as to how one can remove html tags from a string such as the one that we retrieved in my previous tutorial on &lt;a href="./python/fetching-web-pages-python/"
 title="fetching a web page using Python" 
 &gt;
 fetching a web page using Python&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="method-1"&gt;
 &lt;a href="#method-1" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Method 1&lt;/h2&gt;
&lt;p&gt;This method will demonstrate a way that we can remove html tags from a string using regex strings. &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-py" data-lang="py"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;import&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;re&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;TAG_RE &lt;span style="color:#81a1c1"&gt;=&lt;/span&gt; re&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;compile&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;r&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#39;&amp;lt;[^&amp;gt;]+&amp;gt;&amp;#39;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1;font-weight:bold"&gt;def&lt;/span&gt; &lt;span style="color:#88c0d0"&gt;remove_tags&lt;/span&gt;&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;text&lt;span style="color:#eceff4"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;return&lt;/span&gt; TAG_RE&lt;span style="color:#81a1c1"&gt;.&lt;/span&gt;sub&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;,&lt;/span&gt; text&lt;span style="color:#eceff4"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="method-2"&gt;
 &lt;a href="#method-2" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Method 2&lt;/h2&gt;
&lt;p&gt;This is another method we can use to remove html tags using functionality present in the Python Standard library so there is no need for any imports.&lt;/p&gt;</description></item><item><title>AABB Collision Detection Tutorial</title><link>https://tutorialedge.net/gamedev/aabb-collision-detection-tutorial/</link><pubDate>Sat, 15 Apr 2017 09:30:45 +0100</pubDate><guid>https://tutorialedge.net/gamedev/aabb-collision-detection-tutorial/</guid><description>&lt;p&gt;AABB Collision Detection or "Axis-Aligned Bounding Box" Collision detection as it stands for is the simplest form, or one of the simplest forms of collision detection that you can implement in a 2D game. If you have an object that is axis-aligned, ie. not rotated and doesn't need tight collision detection then AABB collision detection is the route you are going to want to take.&lt;/p&gt;
&lt;h2 id="implementing-aabb-collision-detection-in-java"&gt;
 &lt;a href="#implementing-aabb-collision-detection-in-java" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementing AABB Collision Detection in Java&lt;/h2&gt;
&lt;p&gt;In order to be able to accurately perform Axis-Aligned Bounding Box collision detection you'll need at minimum the 4 following characteristics of the object you are wanting to make collidable.&lt;/p&gt;</description></item><item><title>Python Multiprocessing Tutorial</title><link>https://tutorialedge.net/python/python-multiprocessing-tutorial/</link><pubDate>Sat, 15 Apr 2017 09:28:06 +0100</pubDate><guid>https://tutorialedge.net/python/python-multiprocessing-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Last Updated:&lt;/strong&gt; 1st December, 2018&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Previously we&amp;rsquo;ve looked at how you can try to achieve concurrency with Python
using multithreading, the tutorial of which can be found here:
&lt;a href="./python/python-multithreading-tutorial/"
 title="Python Multithreading Tutorial" 
 &gt;
 Python Multithreading Tutorial&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Now we are going to be having a look at how we can sidestep the limiting Global
Interpreter Lock that effectively prevented our multithreaded applications from
being truly concurrent by using the multiprocessing Python module.&lt;/p&gt;</description></item><item><title>Breadth First Search Algorithm Tutorial with Java</title><link>https://tutorialedge.net/artificial-intelligence/breadth-first-search-java/</link><pubDate>Sat, 15 Apr 2017 09:23:35 +0100</pubDate><guid>https://tutorialedge.net/artificial-intelligence/breadth-first-search-java/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This lesson is part of the course:
&lt;a href="./course/artificial-intelligence"&gt;Artificial Intelligence&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id="uninformed-search-vs-informed--heuristic-search"&gt;
 &lt;a href="#uninformed-search-vs-informed--heuristic-search" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Uninformed Search vs Informed / Heuristic Search&lt;/h3&gt;
&lt;p&gt;The next couple of algorithms we will be covering in this Artificial Intelligence course can be classed as either:&lt;/p&gt;
&lt;p&gt;uninformed or blind searches: in which our algorithms have no additional information about states beyond that provided in the problem definition.&lt;/p&gt;
&lt;p&gt;Informed or Heuristic searches: in which our algorithms have some extra knowledge about the problem domain and can distinguish whether or not one non-goal state is “more promising” than another.&lt;/p&gt;</description></item><item><title>Depth First Search in Java</title><link>https://tutorialedge.net/artificial-intelligence/depth-first-search/</link><pubDate>Sat, 15 Apr 2017 09:23:35 +0100</pubDate><guid>https://tutorialedge.net/artificial-intelligence/depth-first-search/</guid><description>&lt;h2 id="depth-first-search"&gt;
 &lt;a href="#depth-first-search" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Depth First Search&lt;/h2&gt;
&lt;p&gt;DFS is another uninformed graph traversal algorithm which produces a non-optimal solution but can be useful for traversing quickly into deeper search domains. Depth first search is very similar to the previously covered breadth first search that we covered in this tutorial: &lt;a href="./artificial-intelligence/breadth-first-search-java/"&gt;breadth first search in Java&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="how-it-works"&gt;
 &lt;a href="#how-it-works" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;How it Works&lt;/h2&gt;
&lt;p&gt;With Depth first search you start at the top most node in a tree and then follow the left most branch until there exists no more leafs in that branch. At that point you will search the nearest ancestor with unexplored nodes until such time as you find the goal node.&lt;/p&gt;</description></item><item><title>Depth Limited Search in Java</title><link>https://tutorialedge.net/artificial-intelligence/depth-limited-search-in-java/</link><pubDate>Sat, 15 Apr 2017 09:23:35 +0100</pubDate><guid>https://tutorialedge.net/artificial-intelligence/depth-limited-search-in-java/</guid><description>&lt;!-- TODO: Revamp This Tutorial --&gt;
&lt;h2 id="about-depth-limited-searching"&gt;
 &lt;a href="#about-depth-limited-searching" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;About Depth Limited Searching&lt;/h2&gt;
&lt;p&gt;Traditional depth first search could be deemed useless in infinite state spaces as they will continue to traverse down the leftmost branch infinitely. This essentially means that the path to the goal node might never be found, in order to combat this we can add a limit to the depth that our search recurses down the tree, this essentially transforms our depth first algorithm into a depth-limited algorithm.&lt;/p&gt;</description></item><item><title>Equal Height Columns in a Row using Flex Box</title><link>https://tutorialedge.net/webdev/equal-height-columns-using-css/</link><pubDate>Sat, 15 Apr 2017 09:19:19 +0100</pubDate><guid>https://tutorialedge.net/webdev/equal-height-columns-using-css/</guid><description>&lt;p&gt;In this tutorial I'll be showcasing how we can achieve equal heights on our columns using the CSS and HTML. More specifically I'll be demonstrating the Flex Box feature of CSS which allows us to create these equal height columns without resorting to a nasty javascript workaround.&lt;/p&gt;
&lt;h2&gt;Flex CSS&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-css" data-lang="css"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;list&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;display&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;flex&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;flex-wrap&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;wrap&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;list-item&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;background-color&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;#eee&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;display&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;flex&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;color&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;white&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;&lt;span style="color:#8fbcbb"&gt;list-content&lt;/span&gt; &lt;span style="color:#eceff4"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#81a1c1;font-weight:bold"&gt;padding&lt;/span&gt;&lt;span style="color:#eceff4"&gt;:&lt;/span&gt; &lt;span style="color:#b48ead"&gt;1.5&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;em&lt;/span&gt;&lt;span style="color:#eceff4"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So how does this work? In our .list class we use display: flex; which initiates flexbox for the outer element. In order for our inner-elements to all have the same height, we have to use display:flex; once again in our .list-item css class.&lt;/p&gt;</description></item><item><title>AngularJS ng-model in ng-if Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-ng-model-in-ng-if-tutorial/</link><pubDate>Sat, 15 Apr 2017 09:17:38 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-ng-model-in-ng-if-tutorial/</guid><description>&lt;p&gt;a quick tip for those trying to get the ng-model directive working in your angularjs application within ng-if.&lt;/p&gt;
&lt;h2&gt;ng-if Child Scopes&lt;/h2&gt;
&lt;p&gt;If you are wanting to use an ng-model scope within an ng-if then you'll have to access that scope using $parent&lt;/p&gt;
&lt;p&gt;Our html page will look something like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;html&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;ng-app&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;testApp&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;head&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;title&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;AngularJS ng-if child scopes example&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;title&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;script&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;src&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;https://ajax.googleapis.com/ajax/libs/angularjs/1.4.5/angular.min.js&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;script&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;head&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;body&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;ng-controller&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;testController&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;ng-if&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;isFalse&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; {{$parent.name}}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;p&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;{{name}}&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;p&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;ng-if&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;isTrue&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;p&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;{{$parent.name}}&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;p&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;div&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;script&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;src&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;script.js&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;script&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;body&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;html&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;And our controller looks something like this:&lt;/p&gt;</description></item><item><title>AngularJS Data Binding Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-data-binding-tutorial/</link><pubDate>Sat, 15 Apr 2017 09:16:16 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-data-binding-tutorial/</guid><description>&lt;p&gt;AngularJS Official Docs on Data Binding can be found here: &lt;a href="https://docs.angularjs.org/guide/databinding"
 title="AngularJS Data Binding" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 AngularJS Data Binding&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Please note that the use of scope is somewhat frowned upon. Check out my
article on
&lt;a href="./javascript/angularjs/working-with-angularjs-component-applications/"
 title="Working with Components" 
 &gt;
 Working with Components&lt;/a&gt; and how you should use one way data-binding.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;What is Data Binding?&lt;/h2&gt;
&lt;p&gt;Data binding is incredibly useful due to the fact it automatically synchronizes the data in both our model and view components. Any changes made to something in the frontend will automatically be reflected in the backend and vice versa. This essentially means we no longer have to worry about complex DOM manipulation and traversal.&lt;/p&gt;</description></item><item><title>AngularJS Controllers Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-controllers-tutorial/</link><pubDate>Sat, 15 Apr 2017 09:10:12 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-controllers-tutorial/</guid><description>&lt;p&gt;AngularJS controllers are somewhat similar to classes in Object Oriented programming and as such you can define the functionality of your applications in these controllers. When a controller is attached to the DOM via the ng-controller directive it instantiates a new Controller object.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Check out my article on
&lt;a href="./javascript/angularjs/working-with-angularjs-component-applications/"&gt;Working
with Components&lt;/a&gt; and see how you should use controllers within a component
based system.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="instantiating-a-controller"&gt;
 &lt;a href="#instantiating-a-controller" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Instantiating a Controller&lt;/h2&gt;
&lt;p&gt;We’ll begin by creating a very simple controller that contains a function that
we’ll call every time we click a button. We’ll also have a $scope variable that
we will bind to somewhere on our HTML page so that we can see the effects of
this function’s execution every time it is pressed.&lt;/p&gt;</description></item><item><title>AngularJS Templating Tutorial Using ng-view</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-template-tutorial-using-ng-view/</link><pubDate>Sat, 15 Apr 2017 09:09:12 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-template-tutorial-using-ng-view/</guid><description>&lt;p&gt;Templating is fantastic for reducing the amount of code you have to maintain, if
you have a defined structure to all of your webapp&amp;rsquo;s pages then templating
allows you to create one master page for this structure and then just replace
pieces of the page with different content based on the url.&lt;/p&gt;
&lt;p&gt;For instance, say we had a blog. If our blog had the same nav bar, the same
header image, the same footer, then it makes sense to put this in one place
instead of constantly repeating it throughout every page in your application. By
defining all this in one page you then have the ability to update your entire
application&amp;rsquo;s design very quickly as opposed to making changes in what could
potentially be hundreds of files.&lt;/p&gt;</description></item><item><title>AngularJS Directives Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-directives-tutorial/</link><pubDate>Sat, 15 Apr 2017 09:08:03 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-directives-tutorial/</guid><description>&lt;p&gt;The official documentation for AngularJS’s directives can be found here: &lt;a href="https://docs.angularjs.org/guide/directive"&gt;AngularJS Directives&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;What Are Directives?&lt;/h2&gt;
&lt;p&gt;Directives essentially allow you to attach behaviors to specific DOM elements. This means you can define your own custom html-like tags and attach all of the functionality you desire to that tag which is perfect for creating breaking up your applications into distinct modules which can be worked on simultaneously in teams of developers.&lt;/p&gt;
&lt;p&gt;Directives are an essential part of the AngularJS framework and if you want a bit of background behind why you should define your own directives rather than use the ng-controller directive then check out this post by one of Paypal’s engineers - &lt;a href="https://medium.com/@bluepnume/sane-scalable-angular-apps-are-tricky-but-not-impossible-lessons-learned-from-paypal-checkout-c5320558d4ef"&gt;Lessons learned from rebuilding Paypal's checkout in AngularJS&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AngularJS Template Route Provider Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/template-route-provider-tutorial/</link><pubDate>Sat, 15 Apr 2017 09:04:56 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/template-route-provider-tutorial/</guid><description>&lt;p&gt;This tutorial covers how you can utilize AngularJS’s $routeProvider in order to create a multiple page application that features one master page. The official documentation for Routing and multiple views can be found here: &lt;a href="https://docs.angularjs.org/tutorial/step_07" target="_blank"&gt;https://docs.angularjs.org/tutorial/step_07 &lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Our Project&lt;/h2&gt;
&lt;p&gt;The structure of our project for this tutorial is going to look a little something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;index.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;scripts.js
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;view&lt;span style="color:#81a1c1"&gt;/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;--&lt;/span&gt; home.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;--&lt;/span&gt; contact.html
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#81a1c1"&gt;--&lt;/span&gt; about.html
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With our index.html being our master page in which we define all javascript dependencies and styling for things like the nav bar and footer etc. We would then typically put all of our page specific content in their own html files. This can be incredibly handy for times when you want to make a simple change to the header of your site that you want reflected across your whole site as it means you only have to make the change in one place.&lt;/p&gt;</description></item><item><title>Interacting With RESTful APIs Using $http in AngularJS</title><link>https://tutorialedge.net/javascript/angularjs/interacting-with-apis-using-http-angularjs/</link><pubDate>Sat, 15 Apr 2017 09:03:47 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/interacting-with-apis-using-http-angularjs/</guid><description>&lt;p&gt;In this tutorial I will be showing you how we can create a frontend angularjs application that could interact with a RESTful API. In order for our Angular applications to be able to make API calls, we’ll have to use the $http service which gives us the ability to perform GET, POST, PUT and DELETE api calls, there are other types of calls but for now we’ll focus on these 4.&lt;/p&gt;</description></item><item><title>AngularJS Filter Search Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-filter-search-tutorial/</link><pubDate>Sat, 15 Apr 2017 08:59:44 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-filter-search-tutorial/</guid><description>&lt;h3&gt;Links:&lt;/h3&gt;
&lt;div class="github-link"&gt;Full Source Code: &lt;a href="https://github.com/emforce/AngularFuzzySearch"&gt;https://github.com/emforce/AngularFuzzySearch&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;In this tutorial I’ll be showing you how you can create a tool which allows you to type in a search query in an input box and see all matches below that input box without having to reload the page and we’ll be leveraging AngularJS’s filter mechanic to do so.&lt;/p&gt;
&lt;p&gt;To get us started we’ll start with mocking up what our page will look like, this is just going to be a basic no-frills design to get us started but feel free to modify it to suit.&lt;/p&gt;</description></item><item><title>Getting Started With Shaders in OpenGL</title><link>https://tutorialedge.net/gamedev/opengl/getting-started-with-shaders/</link><pubDate>Sat, 15 Apr 2017 08:50:41 +0100</pubDate><guid>https://tutorialedge.net/gamedev/opengl/getting-started-with-shaders/</guid><description>&lt;p&gt;The modern OpenGL rendering pipeline rely heavily on shaders to process the huge amounts of data that a highly demanding program like a game requires. These shaders are typically written using the OpenGL Shading Language - GLSL, this language is very similar to C in syntax. &lt;/p&gt;
&lt;p&gt;Learning shaders is just about one of the most important things you can do if you are going to get into graphical programming as it enables you to control just about everything when it comes to rendering your models in a game. Each stage grants an extra level of granularity through which you can create a game that looks like no other and whilst graphics don't make the game, having an aesthetically pleasing game can certainly help it. &lt;/p&gt;</description></item><item><title>Sending Email Using Go And Mailgun</title><link>https://tutorialedge.net/golang/sending-email-using-go-and-mailgun/</link><pubDate>Sat, 15 Apr 2017 08:44:00 +0100</pubDate><guid>https://tutorialedge.net/golang/sending-email-using-go-and-mailgun/</guid><description>&lt;p&gt;In this tutorial I&amp;rsquo;m going to be demonstrating how you can send email with Go and the Mailgun API. Mailgun&amp;rsquo;s API is straightforward and sending email is easy once you&amp;rsquo;ve set everything up properly.&lt;/p&gt;
&lt;h2 id="requirements"&gt;
 &lt;a href="#requirements" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Requirements&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;A Mailgun account with verified domains&lt;/li&gt;
&lt;li&gt;Mailgun&amp;rsquo;s Go package: &lt;a href="https://github.com/mailgun/mailgun-go"
 title="github.com/mailgun/mailgun-go" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 github.com/mailgun/mailgun-go&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Your Mailgun API key&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="implementation"&gt;
 &lt;a href="#implementation" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementation&lt;/h2&gt;
&lt;p&gt;First, install the mailgun-go package:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-sh" data-lang="sh"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;go get github.com/mailgun/mailgun-go/v4
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s a basic example of sending an email using Mailgun:&lt;/p&gt;</description></item><item><title>Retrieving Website Visitor Information Using Javascript</title><link>https://tutorialedge.net/javascript/retrieving-visitor-information-javascript/</link><pubDate>Sat, 15 Apr 2017 08:40:42 +0100</pubDate><guid>https://tutorialedge.net/javascript/retrieving-visitor-information-javascript/</guid><description>&lt;p&gt;In this tutorial I'll be demonstrating how you can retrieve key information about all your website visitors using a very simple javascript snippet. This could in theory be placed on all your website's pages and then returned to a REST API which then stores this information for you to analyse in the future. I thought this would be an interesting little snippet for those of you thinking of rolling your own google analytics-like tracking.&lt;/p&gt;</description></item><item><title>Keeping NodeJS Applications Running Forever Using PM2</title><link>https://tutorialedge.net/nodejs/keeping-node-apps-running-forever-pm2/</link><pubDate>Sat, 15 Apr 2017 08:38:40 +0100</pubDate><guid>https://tutorialedge.net/nodejs/keeping-node-apps-running-forever-pm2/</guid><description>&lt;p&gt;If you write an application that you need to keep running forever on your servers then this is the tutorial for you. &lt;/p&gt;
&lt;p&gt;If you're a software developer working on business critical applications and have to adhere to strict Service Level Agreements (SLAs for short) then you know just how vital it is to have your applications back up and running the second they fall over, every second counts when trying to achieve the 5 9's or 99.999% availability throughout the year. In this tutorial I'll be demonstrating the effectiveness of PM2 which is a production process manager for Node.js applications which also features a built-in load balancer for those high-performance applications. &lt;/p&gt;</description></item><item><title>Setting a Default Value for Select Elements in AngularJS</title><link>https://tutorialedge.net/javascript/angularjs/setting-default-select-value-angularjs/</link><pubDate>Sat, 15 Apr 2017 08:37:21 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/setting-default-select-value-angularjs/</guid><description>&lt;p&gt;This is just a quick code snippet for those of you facing this slight problem when developing your applications using AngularJS 1.5. This works for those of you &lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;select&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;ng-model&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;selection&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;ng-init&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;selection =&amp;#39;The First Default Option&amp;#39;&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;option&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;The First Default Option&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;option&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;option&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;The Second non-default option&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;option&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;select&lt;/span&gt;&lt;span style="color:#eceff4"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Using Hidden Input in a Form in AngularJS</title><link>https://tutorialedge.net/javascript/angularjs/hidden-input-form-angularjs/</link><pubDate>Sat, 15 Apr 2017 08:35:56 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/hidden-input-form-angularjs/</guid><description>&lt;p&gt;This ended up being an interesting little problem for me during one of my programming sessions. Below you'll find a couple of different methods that you can use to pass hidden data to any form submission using AngularJS.&lt;/p&gt;
&lt;h3 id="method-1"&gt;
 &lt;a href="#method-1" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Method 1&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-html" data-lang="html"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#eceff4"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;input&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;type&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;text&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;name&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;someData&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;ng-model&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;data&amp;#34;&lt;/span&gt; &lt;span style="color:#8fbcbb"&gt;style&lt;/span&gt;&lt;span style="color:#81a1c1"&gt;=&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;display: none;&amp;#34;&lt;/span&gt; &lt;span style="color:#eceff4"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description></item><item><title>Building a Webserver using ExpressJS and NodeJS</title><link>https://tutorialedge.net/nodejs/creating-a-webserver-with-nodejs/</link><pubDate>Sat, 15 Apr 2017 08:32:01 +0100</pubDate><guid>https://tutorialedge.net/nodejs/creating-a-webserver-with-nodejs/</guid><description>&lt;p&gt;This is the first tutorial in a series in which we’ll be building up a website
for a domain name I’ve been sitting on for a few years now. This is intended to
show you everything it takes in order to program your own website using NodeJS
and the new Angular2 framework.&lt;/p&gt;
&lt;h2 id="creating-a-simple-web-server-using-nodejs-and-expressjs"&gt;
 &lt;a href="#creating-a-simple-web-server-using-nodejs-and-expressjs" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Creating a Simple Web Server Using NodeJS and ExpressJS.&lt;/h2&gt;
&lt;p&gt;So the very first thing we need for our site is the foundation and for this we
can use a very simple ExpressJS server.&lt;/p&gt;</description></item><item><title>Executing Shell Scripts With NodeJS</title><link>https://tutorialedge.net/nodejs/executing-shell-scripts-with-nodejs/</link><pubDate>Sat, 15 Apr 2017 08:26:02 +0100</pubDate><guid>https://tutorialedge.net/nodejs/executing-shell-scripts-with-nodejs/</guid><description>&lt;p&gt;One of the problems I’ve been faced with recently is how do I go about executing shell scripts using NodeJS. This essentially allows me to query the status of certain processes and utilize the full power of the unix shell commands. &lt;/p&gt;
&lt;h2&gt;Implementation using NodeJS child_process Module&lt;/h2&gt;
&lt;p&gt;Node thankfully already has a module which is designed specifically for executing shell scripts and can be found &lt;a href="https://nodejs.org/api/child_process.html" target="_blank"&gt;here&lt;/a&gt; in the documentation.&lt;/p&gt;
&lt;p&gt;This module essentially creates a child process in which we can execute our shell script and also sets everything up for us so that we can utilize stdin, stdout and stderr within our NodeJS application. &lt;/p&gt;</description></item><item><title>Reading and Writing Files With NodeJS</title><link>https://tutorialedge.net/nodejs/reading-writing-files-with-nodejs/</link><pubDate>Sat, 15 Apr 2017 08:20:02 +0100</pubDate><guid>https://tutorialedge.net/nodejs/reading-writing-files-with-nodejs/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial&lt;/strong&gt; I’m going to be showing you exactly how we can read and write files on our local filesystem using NodeJS.&lt;/p&gt;
&lt;h2 id="reading-from-files"&gt;
 &lt;a href="#reading-from-files" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Reading From Files&lt;/h2&gt;
&lt;p&gt;Being able to read from files on your local file system can be hugely useful and there are a number of different things you can build on top of this. A log reader, importing information from spreadsheets and xml files or whatever you can think of, being able to read from files is hugely useful.&lt;/p&gt;</description></item><item><title>Creating and Deleting Directories With NodeJS</title><link>https://tutorialedge.net/nodejs/creating-deleting-directories-with-nodejs/</link><pubDate>Sat, 15 Apr 2017 08:17:02 +0100</pubDate><guid>https://tutorialedge.net/nodejs/creating-deleting-directories-with-nodejs/</guid><description>&lt;p&gt;&lt;strong&gt;In this tutorial I’ll be showing you how to create and delete
directories using NodeJS&lt;/strong&gt; and we’ll be using the mkdirp and the rimraf
node package in order to achieve this.&lt;/p&gt;
&lt;h2 id="creating-directories"&gt;
 &lt;a href="#creating-directories" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Creating Directories&lt;/h2&gt;
&lt;p&gt;In order to create a directory we’ll need first download the mkdirp npm package,
we can do this like so:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install mkdirp &lt;span style="color:#81a1c1"&gt;--&lt;/span&gt;local
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This should install the mkdirp package as well as any of it’s dependencies in a
node_modules directory within your current directory. Once this has completed we
can then start using this new package.&lt;/p&gt;</description></item><item><title>Editing XML Files With NodeJS</title><link>https://tutorialedge.net/nodejs/editing-xml-files-with-nodejs/</link><pubDate>Sat, 15 Apr 2017 08:14:10 +0100</pubDate><guid>https://tutorialedge.net/nodejs/editing-xml-files-with-nodejs/</guid><description>&lt;p&gt;XML files are still widely used in enterprise programs and being able to manipulate xml files can be incredibly important.&lt;/p&gt;
&lt;h2&gt;XML2JS Node Package&lt;/h2&gt;
&lt;p&gt;In this tutorial I’ll be demonstrating how you can easily manipulate XML files using the xml2js node package. This package is great due to the fact it reads in an xml string and converts it to a far easier to use json structure. &lt;/p&gt;
&lt;h4&gt;Reading in our XML File&lt;/h4&gt;
&lt;p&gt;Create a new js file and type the following: &lt;/p&gt;</description></item><item><title>An Introduction To Artificial Intelligence</title><link>https://tutorialedge.net/artificial-intelligence/introduction-to-artificial-intelligence/</link><pubDate>Sat, 15 Apr 2017 08:11:58 +0100</pubDate><guid>https://tutorialedge.net/artificial-intelligence/introduction-to-artificial-intelligence/</guid><description>&lt;p&gt;This is lesson one of the &lt;a href="./course/artificial-intelligence"&gt;Artificial Intelligence&lt;/a&gt; course on this website. &lt;/p&gt;
&lt;h2 id="what-is-artificial-intelligence"&gt;
 &lt;a href="#what-is-artificial-intelligence" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What is Artificial Intelligence?&lt;/h2&gt;
&lt;p&gt;Artificial Intelligence is a huge field of computer science that is focused primarily on building agents that think and perform actions independant from human interference. If you are or have ever been a gamer then you will have experienced artificial intelligence in action contained within the non-player characters that try to prevent you from winning the games.&lt;/p&gt;</description></item><item><title>What Is An Intelligent Agent</title><link>https://tutorialedge.net/artificial-intelligence/what-is-intelligent-agent/</link><pubDate>Sat, 15 Apr 2017 08:10:24 +0100</pubDate><guid>https://tutorialedge.net/artificial-intelligence/what-is-intelligent-agent/</guid><description>&lt;p&gt;In Artificial Intelligence, Intelligent agents are the decision makers. They perceive their environment through a series of sensors and act upon this information using actuators.&lt;/p&gt;
&lt;p&gt;A simple example of this is a robot hoover. Through a series of sensors, it can sense whether or not the floor is dirty and based off this information it will then decide whether or not to continue cleaning the floor.&lt;/p&gt;
&lt;h2 id="intelligent-agents-in-industry"&gt;
 &lt;a href="#intelligent-agents-in-industry" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Intelligent Agents In Industry&lt;/h2&gt;
&lt;h3 id="finance"&gt;
 &lt;a href="#finance" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Finance&lt;/h3&gt;
&lt;p&gt;An example of a useful intelligent agent in the finance industry would be something that perceives the stock environment and then acts on this information in order to make trades and generate profit. AI trading systems have a huge advantage over traditional human traders as they are able to amalgamate huge sums of information in order to place their trades. &lt;/p&gt;</description></item><item><title>Code of Conduct - TutorialEdge</title><link>https://tutorialedge.net/code/</link><pubDate>Fri, 14 Apr 2017 20:28:13 +0100</pubDate><guid>https://tutorialedge.net/code/</guid><description>&lt;blockquote&gt;
&lt;p&gt;🧙 &lt;strong&gt;Note&lt;/strong&gt; - TutorialEdge uses the code of conduct from the Python Software Foundation.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Members of the TutorialEdge clan are open, considerate, and respectful. Behaviours that reinforce these values contribute to a positive environment, and include:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Being open&lt;/strong&gt;. Members of the community are open to collaboration, whether it&amp;rsquo;s on PEPs, patches, problems, or otherwise.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Focusing on what is best for the community&lt;/strong&gt;. We&amp;rsquo;re respectful of the processes set forth in the community, and we work within them.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Being respectful of differing viewpoints and experiences&lt;/strong&gt;. We&amp;rsquo;re receptive to constructive comments and criticism, as the experiences and skill sets of other members contribute to the whole of our efforts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Showing empathy towards other community members&lt;/strong&gt;. We&amp;rsquo;re attentive in our communications, whether in person or online, and we&amp;rsquo;re tactful when approaching differing views.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Being considerate&lt;/strong&gt;. Members of the community are considerate of their peers &amp;ndash; other Python users.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Being respectful&lt;/strong&gt;. We&amp;rsquo;re respectful of others, their positions, their skills, their commitments, and their efforts.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gracefully accepting constructive criticism&lt;/strong&gt;. When we disagree, we are courteous in raising our issues.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Using welcoming and inclusive language&lt;/strong&gt;. We&amp;rsquo;re accepting of all who wish to take part in our activities, fostering an environment where anyone can participate and everyone can make a difference.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="our-standards"&gt;
 &lt;a href="#our-standards" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Our Standards&lt;/h2&gt;
&lt;p&gt;Every member of our community has the right to have their identity respected. The Python community is dedicated to providing a positive experience for everyone, regardless of age, gender identity and expression, sexual orientation, disability, physical appearance, body size, ethnicity, nationality, race, or religion (or lack thereof), education, or socio-economic status.&lt;/p&gt;</description></item><item><title>Get Involved</title><link>https://tutorialedge.net/test/</link><pubDate>Fri, 14 Apr 2017 20:28:13 +0100</pubDate><guid>https://tutorialedge.net/test/</guid><description>&lt;h2 id="testing-main-branch"&gt;
 &lt;a href="#testing-main-branch" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Testing Main Branch&lt;/h2&gt;
&lt;Quiz question="Who Is The Best #Peep?" A="Elliot" B="Nadi" C="Donna" correct="A" answer="The correct answer is A" /&gt;
&lt;h3 id="why-hello"&gt;
 &lt;a href="#why-hello" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;why hello&lt;/h3&gt;
&lt;p&gt;This is an example&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-js" data-lang="js"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;console&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;log&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;soething&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;console&lt;span style="color:#eceff4"&gt;.&lt;/span&gt;log&lt;span style="color:#eceff4"&gt;(&lt;/span&gt;&lt;span style="color:#a3be8c"&gt;&amp;#34;else&amp;#34;&lt;/span&gt;&lt;span style="color:#eceff4"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Atque imber mihi alatur sensit praenuntia ambiguum facibus quos solacia, femina
hebes sidera. Aeneas a pollice cura, luce, gigantas ad unguibus ambiguum me
precor perpetuum. Mitia fratremque oculis.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Integrate $$\int x^3 dx$$&lt;/p&gt;
&lt;h3 id="what-is-markdown"&gt;
 &lt;a href="#what-is-markdown" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;what is Markdown?&lt;/h3&gt;
&lt;p&gt;see &lt;a href="http://en.wikipedia.org/wiki/Markdown"
 title="Wikipedia" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note&lt;/strong&gt;
Markdown is a lightweight markup language, originally created by John Gruber
and Aaron Swartz allowing people &amp;ldquo;to write using an easy-to-read,
easy-to-write plain text format, then convert it to structurally valid XHTML
(or HTML)&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Redirect</title><link>https://tutorialedge.net/redirect/</link><pubDate>Fri, 14 Apr 2017 20:28:13 +0100</pubDate><guid>https://tutorialedge.net/redirect/</guid><description/></item><item><title>Support</title><link>https://tutorialedge.net/support/</link><pubDate>Fri, 14 Apr 2017 20:28:13 +0100</pubDate><guid>https://tutorialedge.net/support/</guid><description>&lt;p&gt;If you have any issues or require my assistance with anything, please reach out to me at &lt;a href="mailto:support@tutorialedge.net"
 title="support@tutorialedge.net" 
 &gt;
 support@tutorialedge.net&lt;/a&gt; and I will get back to you as soon as possible!&lt;/p&gt;
&lt;h2 id="frequently-asked-questions"&gt;
 &lt;a href="#frequently-asked-questions" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Frequently Asked Questions&lt;/h2&gt;
&lt;p&gt;This is a list of answers to some of the frequently asked questions from our users. If you aren&amp;rsquo;t able to find an answer to your question here then please feel free to reach out to &lt;a href="mailto:support@tutorialedge.net"
 title="support@tutorialedge.net" 
 &gt;
 support@tutorialedge.net&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Tutorials</title><link>https://tutorialedge.net/tutorials/</link><pubDate>Fri, 14 Apr 2017 20:28:13 +0100</pubDate><guid>https://tutorialedge.net/tutorials/</guid><description/></item><item><title>Angular</title><link>https://tutorialedge.net/course/angular/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/course/angular/</guid><description>&lt;h4 id="course-outline"&gt;
 &lt;a href="#course-outline" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Course Outline&lt;/h4&gt;
&lt;p&gt;Angular 2 is the latest iteration of the wildly successful Angular framework and
this course is designed to take you all the way from the basics through to
creating high-quality angular applications.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This course is built using a minimum of &lt;strong&gt;Angular 2.2&lt;/strong&gt;. I&amp;rsquo;ve also focused on
building these tutorials purely in Typescript.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you are interested in buying books to aid in your learning of the Angular
framework then I suggest you checkout my list of
&lt;a href="./typescript/angular/best-books-for-learning-angular/"
 title="The Top Angular Programming Books" 
 &gt;
 The Top Angular Programming Books&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AngularJS</title><link>https://tutorialedge.net/course/angularjs/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/course/angularjs/</guid><description>&lt;p&gt;In this course I&amp;rsquo;ll be demonstrating the absolute fundamentals to developing
applications with AngularJS 1.X. We&amp;rsquo;ll begin by creating a very simple admin
application that will perform multiple tasks such as consuming RESTful APIs,
Lazy Loading articles and more.&lt;/p&gt;
&lt;p&gt;We’ll begin by creating some very simple Single Page Applications or SPAs and
then build up on these until we’ve covered everything you need in order to
develop your own web applications using the AngularJS framework.&lt;/p&gt;</description></item><item><title>Artificial Intelligence</title><link>https://tutorialedge.net/course/artificial-intelligence/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/course/artificial-intelligence/</guid><description>&lt;h4 id="course-outline"&gt;
 &lt;a href="#course-outline" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Course Outline&lt;/h4&gt;
&lt;p&gt;Over this course I’m aiming to introduce you to key strategies used by game
developers when implementing Artificial Intelligence systems into their own
games. I’ll be covering popular algorithms such as the A* search algorithm,
breadth first, depth first, Alpha-beta pruning and more and hopefully give you a
good grounding of the basics of artificial intelligence.&lt;/p&gt;
&lt;p&gt;I’m going to start of by introducing concepts such as agents and rationality and
then build up to implementing a number of highly-used Artificial Intelligence
algorithms.&lt;/p&gt;</description></item><item><title>Profile Settings</title><link>https://tutorialedge.net/profile/settings/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/profile/settings/</guid><description/></item><item><title>Python</title><link>https://tutorialedge.net/course/python/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/course/python/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This course was built using Python 3.6. However some of the concepts will be
applicable to earlier or later versions of Python.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Python is without a doubt one of the best languages to learn if you are
interested in programming. It&amp;rsquo;s syntax is simpler to follow than say, that of
say C or C++ for those with minimal programming experience and it&amp;rsquo;s range of
supporting libraries make it incredibly powerful if you want to do complex
things like data science.&lt;/p&gt;</description></item><item><title>React.JS</title><link>https://tutorialedge.net/course/reactjs/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/course/reactjs/</guid><description/></item><item><title>Rust</title><link>https://tutorialedge.net/course/rust/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/course/rust/</guid><description>&lt;h4 id="course-outline"&gt;
 &lt;a href="#course-outline" class="heading-anchor" aria-hidden="true"&gt;####&lt;/a&gt;Course Outline&lt;/h4&gt;
&lt;p&gt;In this course, we are going to look at some of the fundamentals of the Rust
programming language.&lt;/p&gt;</description></item><item><title>Software Engineering</title><link>https://tutorialedge.net/course/software-engineer/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/course/software-engineer/</guid><description/></item><item><title>Web Development</title><link>https://tutorialedge.net/course/webdev/</link><pubDate>Fri, 14 Apr 2017 20:27:58 +0100</pubDate><guid>https://tutorialedge.net/course/webdev/</guid><description>&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Web Development is an incredibly fast paced and exciting area to dive into.
We&amp;rsquo;ve seen a huge ecosystem of frameworks grow out from rather simple roots and
you&amp;rsquo;ll find that more and more standalone desktop applications are migrating to
a web frontend.&lt;/p&gt;
&lt;p&gt;For beginners wanting to learn how to program, HTML, CSS and Javascript offer a
very simple and instantly rewarding way to get your hands dirty and gain some
form of experience. With web development you&amp;rsquo;ll instantly see how your code
impacts what is displayed in the browser and learning some basic javascript
gives you an insight into how other programming languages work.&lt;/p&gt;</description></item><item><title>Converting CSV to JSON using NodeJS</title><link>https://tutorialedge.net/nodejs/converting-csv-json-node/</link><pubDate>Sun, 09 Apr 2017 21:29:02 +0100</pubDate><guid>https://tutorialedge.net/nodejs/converting-csv-json-node/</guid><description>&lt;p&gt;In this tutorial I’m going to be showing you how we can create a NodeJS script
that takes in a csv file and outputs the contents of that CSV file as JSON.&lt;/p&gt;
&lt;p&gt;In order to do this conversion we’ll be using the
&lt;a href="https://www.npmjs.com/package/csvtojson"&gt;csvtojson&lt;/a&gt; node package.
This package will do pretty much all the heavy lifting for us and having used it
in production environments I can say that it’s remarkably easy to implement into
a project.&lt;/p&gt;</description></item><item><title>Writing Your Own Logging System NodeJS</title><link>https://tutorialedge.net/nodejs/writing-your-own-logging-system-nodejs/</link><pubDate>Sun, 09 Apr 2017 21:26:14 +0100</pubDate><guid>https://tutorialedge.net/nodejs/writing-your-own-logging-system-nodejs/</guid><description>&lt;h2 id="logging---why-is-it-important"&gt;
 &lt;a href="#logging---why-is-it-important" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Logging - Why Is It Important?&lt;/h2&gt;
&lt;p&gt;Logs are an invaluable resource when it comes to effectively maintaining
applications. Think of them as breadcrumbs you can follow to find out where your
application has faltered. In simple applications this may be unnecessary and
overkill, but in production applications that work with highly sensitive and
valuable data, logs are priceless.&lt;/p&gt;
&lt;h2 id="logging-in-nodejs-applications"&gt;
 &lt;a href="#logging-in-nodejs-applications" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Logging in NodeJS Applications&lt;/h2&gt;
&lt;p&gt;In this tutorial I’m going to be demonstrating a quick and simple method of
logging a very simple server program.&lt;/p&gt;</description></item><item><title>Monitoring Server Stats With NodeJS</title><link>https://tutorialedge.net/nodejs/monitoring-server-stats-with-nodejs/</link><pubDate>Sun, 09 Apr 2017 21:25:15 +0100</pubDate><guid>https://tutorialedge.net/nodejs/monitoring-server-stats-with-nodejs/</guid><description>&lt;p&gt;In production environments having visibility over how your systems are
performing is vital. Being able to watch memory usage and ensure that servers
are not being brought down by memory leaks and greedy programs can be hugely
beneficial and can help you deal with issues before they become real headaches.&lt;/p&gt;
&lt;p&gt;In this tutorial I’m going to be demonstrating how you can build a simple, yet
effective NodeJS based monitoring system that will monitor your servers CPU
usage, the total memory for a system and the current free memory for a system,
the system uptime and possibly most importantly the average load for the last 15
minutes.&lt;/p&gt;</description></item><item><title>AngularJS Factory Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-factory-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:22:46 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-factory-tutorial/</guid><description>&lt;h2 id="what-are-factories"&gt;
 &lt;a href="#what-are-factories" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Are Factories&lt;/h2&gt;
&lt;p&gt;Services are essentially ways we can share code across our AngularJS
applications. Say for instance you have an application that interacts with a
RESTful API, you would typically create a factory which would return an object
that contains all the functions necessary to interact with that API.&lt;/p&gt;
&lt;p&gt;By using a factory object, we can standardise the way we interact with the REST
API and reduce the amount of duplicate code we have scattered around our
application.&lt;/p&gt;</description></item><item><title>AngularJS Filter Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-filter-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:22:03 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-filter-tutorial/</guid><description>&lt;h2 id="introduction"&gt;
 &lt;a href="#introduction" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Introduction&lt;/h2&gt;
&lt;p&gt;Filters allow us to perform a number of incredibly useful things on bindings in
views within our AngularJS applications. By definition filters select a subset
of items from an array and returns it as a new array.&lt;/p&gt;
&lt;p&gt;By employing filters we are able to easily manipulate entire arrays in the
front-end giving us far more power in the way we wish to display our data.&lt;/p&gt;
&lt;p&gt;The Official Documentation for filters can be found here:
&lt;a href="https://docs.angularjs.org/api/ng/filter/filter"
 title="AngularJS Filter Documentation" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 AngularJS Filter Documentation&lt;/a&gt;&lt;/p&gt;</description></item><item><title>AngularJS Form Validation Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-form-validation-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:20:37 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-form-validation-tutorial/</guid><description>&lt;p&gt;In this tutorial I’m going to be demonstrating how we can implement form
validation using the AngularJS framework.&lt;/p&gt;
&lt;p&gt;Form validation is a user experience designers best friend when ensuring
application users are inputting the correct data into your form. If you had a
web application that took in email addresses from prospective clients then you
could employ form validation to ensure that they email addresses they are
putting in look like standard email addresses. Or you could enforce passwords to
follow certain strength guidelines etc.&lt;/p&gt;</description></item><item><title>AngularJS Project Structure Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-project-structure-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:18:27 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-project-structure-tutorial/</guid><description>&lt;p&gt;Project organization is important for all angularjs applications. Having a well
defined and easy to traverse project structure can be hugely beneficial further
down the line when you have to deal with maintenance and enhancements.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m going to start off by showing you sub-optimal project structures and then
move on to the most recommended way of structuring your angularjs projects.&lt;/p&gt;
&lt;h2 id="simple-pocs-and-tiny-applications"&gt;
 &lt;a href="#simple-pocs-and-tiny-applications" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Simple PoCs and Tiny Applications&lt;/h2&gt;
&lt;p&gt;There are multiple ways we can structure applications and of course different
structures are better suited for different applications. For incredibly simple
PoCs and technical demos then you might be better suited to a flat structure
that looks like so:&lt;/p&gt;</description></item><item><title>Automating Your AngularJS Workflow With Gulp</title><link>https://tutorialedge.net/javascript/angularjs/automating-your-angularjs-workflow-with-gulp/</link><pubDate>Sun, 09 Apr 2017 21:17:41 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/automating-your-angularjs-workflow-with-gulp/</guid><description>&lt;h3 id="automate-the-repeatable-things"&gt;
 &lt;a href="#automate-the-repeatable-things" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Automate the Repeatable Things&lt;/h3&gt;
&lt;p&gt;Gulp is a task runner that allows you to define a series repeatable tasks that
can be run any time you need. You can automate boring things like the
minification and uglification of your javascript or whatever else you do in
order to make your code production ready.&lt;/p&gt;
&lt;h3 id="setting-up-gulp"&gt;
 &lt;a href="#setting-up-gulp" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Setting Up Gulp&lt;/h3&gt;
&lt;p&gt;Thankfully, Gulp is easily installable using npm.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#d8dee9;background-color:#2e3440;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-s" data-lang="s"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;npm install &lt;span style="color:#81a1c1"&gt;--&lt;/span&gt;global gulp&lt;span style="color:#81a1c1"&gt;-&lt;/span&gt;cli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once this has successfully run, type &lt;code&gt;gulp&lt;/code&gt; into your command line and you
should be presented with a list of different options if it was installed
successfully.&lt;/p&gt;</description></item><item><title>Working With AngularJS Component Based Applications</title><link>https://tutorialedge.net/javascript/angularjs/working-with-angularjs-component-applications/</link><pubDate>Sun, 09 Apr 2017 21:15:58 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/working-with-angularjs-component-applications/</guid><description>&lt;p&gt;If you haven’t read my article on using a different architecture styles in your
AngularJS applications then I recommend you check it out here:
&lt;a href="./javascript/angularjs/angularjs-project-structure-tutorial/"
 title="Structuring AngularJS Applications" 
 &gt;
 Structuring AngularJS Applications&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;In this article we will be having a look at the key features present in my
&lt;a href="https://github.com/emforce/Angular-Component-Admin-Panel"
 title="AngularJS Admin Panel" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 AngularJS Admin Panel&lt;/a&gt;
application. This application utilizes a component based architecture and
follows some of the best practices outlined in Todd Motto’s
&lt;a href="https://github.com/toddmotto/angular-styleguide"
 title="Style Guide" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Style Guide&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Integrating Highcharts-ng into your AngularJS Applications</title><link>https://tutorialedge.net/javascript/angularjs/integrating-highcharts-ng-angularjs/</link><pubDate>Sun, 09 Apr 2017 21:14:45 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/integrating-highcharts-ng-angularjs/</guid><description>&lt;p&gt;In this tutorial we’ll be having a look at how you can effectively implement
highcharts.js into your angularjs applications. We’ll be following a component
based architecture and enforcing things like one-way data-binding as is
suggested in Todd Mottos
&lt;a href="https://github.com/toddmotto/angular-styleguide"
 title="AngularJS Style Guide" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 AngularJS Style Guide&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;If you already follow a component based architecture, then it should should be
very easy to integrate the code in this tutorial straight into your application
without too much fuss.&lt;/p&gt;</description></item><item><title>AngularJS Event Handling Tutorial</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-event-handling-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:13:59 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-event-handling-tutorial/</guid><description>&lt;p&gt;In this tutorial we’ll be looking at the different ways we can handle events in
AngularJS. We’ll be exploring several of the event listening directives that
AngularJS has on offer and how we can use these to create cool behaviours in our
AngularJS Applications.&lt;/p&gt;
&lt;div class="github-link"&gt;
All code in this tutorial can be found in this github repo: &lt;a href="https://github.com/elliotforbes/angularjs-fundamentals"&gt;Github Repo&lt;/a&gt;
&lt;/div&gt;
&lt;h2 id="browser-events"&gt;
 &lt;a href="#browser-events" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Browser Events&lt;/h2&gt;
&lt;p&gt;In most modern web browsers, every time something interesting happens in either
the Document or the browser an event is generated. Within AngularJS we can
register event listeners that will listen for said events and perform some
action whenever they occur.&lt;/p&gt;</description></item><item><title>Passing Data Between Routes in AngularJS</title><link>https://tutorialedge.net/javascript/angularjs/passing-data-between-routes-angularjs/</link><pubDate>Sun, 09 Apr 2017 21:13:23 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/passing-data-between-routes-angularjs/</guid><description>&lt;p&gt;In this tutorial we’ll be looking at how we can store or pass information
between routes in an AngularJS application. This can be useful in a number of
different applications and is actually quite simple.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;This tutorial will be using the code from this github repo: &lt;a href="https://github.com/elliotforbes/angularjs-fundamentals"
 title="AngularJS Fundamentals" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 AngularJS Fundamentals&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you want to see a working example of this then simply clone the repo to your
local machine and run it. I typically use the npm module: live-server in order
to run my applications: &lt;a href="https://github.com/tapio/live-server"
 title="link" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 link&lt;/a&gt;&lt;/p&gt;</description></item><item><title>angularjs most important changes 1 6</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-most-important-changes-1-6/</link><pubDate>Sun, 09 Apr 2017 21:12:25 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-most-important-changes-1-6/</guid><description>&lt;div class="github-link"&gt;The changelog with the AngularJS 1.6 release notes can be found here: &lt;a href="https://github.com/angular/angular.js/blob/master/CHANGELOG.md"&gt;AngularJS 1.6-RC.0&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;After having a look at the AngularJS release notes for 1.6, I thought I’d
compile my thoughts together as to the most important changes to the framework
in the coming release.&lt;/p&gt;
&lt;h2 id="expression-sandbox-removal"&gt;
 &lt;a href="#expression-sandbox-removal" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Expression Sandbox Removal&lt;/h2&gt;
&lt;p&gt;&lt;a href="http://angularjs.blogspot.co.uk/2016/09/angular-16-expression-sandbox-removal.html"
 title="Expression Sandbox Removal Full Notes" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Expression Sandbox Removal Full Notes&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The expression sandbox removal was essentially something that checked to see if
your code was accidentally accessing arbitrary javascript and discourage you
from placing any business logic inside your templates.&lt;/p&gt;</description></item><item><title>How To Store Information in Cookies in AngularJS</title><link>https://tutorialedge.net/javascript/angularjs/angularjs-store-cookies-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:11:31 +0100</pubDate><guid>https://tutorialedge.net/javascript/angularjs/angularjs-store-cookies-tutorial/</guid><description>&lt;p&gt;In this tutorial we look at how you can store information in cookies in your
AngularJS application.&lt;/p&gt;
&lt;p&gt;A cookie is a small piece of data that’s typically sent from a website you may
be viewing and stored by your web browser. We can use these cookies for a wide
range of things, from storing the last viewed items of a visitor to
authentication cookies. These cookies persist across requests and thus are
advantageous over using parent components or services to store information
between routes as is detailed here:
&lt;a href="./javascript/angularjs/passing-data-between-routes-angularjs/"
 title="Passing Information Between Routes using Services" 
 &gt;
 Passing Information Between Routes using Services&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Go Integer String Conversion Tutorial</title><link>https://tutorialedge.net/golang/golang-integer-string-conversion-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:09:39 +0100</pubDate><guid>https://tutorialedge.net/golang/golang-integer-string-conversion-tutorial/</guid><description>&lt;p&gt;In this tutorial we briefly look at how one can convert an integer to string and
back again in GoLang. In order to do this we’ll be using the ‘strconv’ package
and the Atoi and Itoa functions.&lt;/p&gt;
&lt;p&gt;Full documentation of the strconv package can be found here:
&lt;a href="https://golang.org/pkg/strconv/"
 title="Strconv Package" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Strconv Package&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you’re interested in working with strings more broadly, you may also want to check out our &lt;a href="./golang/golang-integer-string-conversion-tutorial/"
 title="string manipulation guide" 
 &gt;
 string manipulation guide&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Angular Modules Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-modules-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:05:28 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-modules-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built of the official Angular 2.2 release.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we’ll be examining what modules are in Angular 2.0 as well as
how to define them, what the best practices are for using modules and what the
differences are between 1._ Modules and 2._ modules.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Official documentation for Angular 2 Modules can be found here:
&lt;a target="_blank" href="https://angular.io/docs/ts/latest/guide/ngmodule.html"&gt;Angular
2 Modules&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="what-are-modules"&gt;
 &lt;a href="#what-are-modules" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Are Modules?&lt;/h2&gt;
&lt;p&gt;Typically a module would contain all the code necessary for one cohesive piece
of functionality for your application. So say you were designing an admin
dashboard for your website or application. You would have one root module and
possibly a module for your articles section, a module for your users section, a
module for your stats section and so on.&lt;/p&gt;</description></item><item><title>Angular Components Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-components-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:04:56 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-components-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was created using Angular 2.2&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Most new frontend frameworks feature this concept of components and
compartmentalizing blocks of code into distinct blocks that can be reused in
multiple locations around your application. In Angular 2 we can do this by
creating our own components.&lt;/p&gt;
&lt;h2 id="what-are-components"&gt;
 &lt;a href="#what-are-components" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;What Are Components?&lt;/h2&gt;
&lt;p&gt;In Angular we can define these things we call components. These components are
functional blocks of code that we can attach to html tags. Say for instance we
are creating an application that mimics facebook, we want a to display a small
widget on the side of the page that shows the current users current profile
picture, as well as some other pieces of information. We could encapsulate all
the functionality of this widget into a component.&lt;/p&gt;</description></item><item><title>Angular Services Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-services-tutorial/</link><pubDate>Sun, 09 Apr 2017 21:04:22 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-services-tutorial/</guid><description>&lt;p&gt;If you’ve ever written an application in Angular 1.* that interfaces with a
RESTful web API then you should have come across services. Services are
essentially the interfaces we should use in order to interact with these APIs.&lt;/p&gt;
&lt;p&gt;They essentially provide a cleaner interface with which we can interact with
APIs. If you are building a todo application that interacts with say a ToDo REST
api then what method do you think is cleaner?&lt;/p&gt;</description></item><item><title>The Top Books For Learning Angular</title><link>https://tutorialedge.net/typescript/angular/best-books-for-learning-angular/</link><pubDate>Sun, 09 Apr 2017 21:03:26 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/best-books-for-learning-angular/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The books listed below might specifically state they are for Angular 2.
However due to semantic versioning these will still be relevant if you are
working with Angular 4+&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this article we&amp;rsquo;ll be covering some of the best books you can buy if you are
wanting to learn the intricacies of the Angular framework. If you have been
following my site for a while you&amp;rsquo;ll know I am a huge advocate for the Angular
framework. I was introduced to the world of AngularJS in my first position at my
current company and I&amp;rsquo;ve gone on to specialize in frontend design and
development using both the original AngularJS and Angular 2+.&lt;/p&gt;</description></item><item><title>Angular Get Current Route using the Location Service</title><link>https://tutorialedge.net/typescript/angular/angular-get-current-route-location/</link><pubDate>Sun, 09 Apr 2017 20:56:49 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-get-current-route-location/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Angular 2.2. If you want to check out the
official documentation for
&lt;a href="https://angular.io/docs/ts/latest/api/common/index/Location-class.html"&gt;Angular
2 Location&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we’ll be looking at various ways we can obtain the current URL
of our application in Angular 2.&lt;/p&gt;
&lt;h2 id="the-location-service"&gt;
 &lt;a href="#the-location-service" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;The Location Service&lt;/h2&gt;
&lt;p&gt;The location service is part of the &lt;strong&gt;@angular/common&lt;/strong&gt; module. It allows you to
interact directly with a browser’s URL and can read and redirect the user should
you wish to.&lt;/p&gt;</description></item><item><title>Angular Detecting Route Changes Within Your Application</title><link>https://tutorialedge.net/typescript/angular/angular-detecting-route-changes/</link><pubDate>Sun, 09 Apr 2017 20:55:22 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-detecting-route-changes/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Angular 2.2. Some of the features in this
tutorial may not work for earlier/later versions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Detecting whenever a route change happens in your application can be very useful
for a multitude of reasons. For instance you may wish to store form data in a
cookie in case they accidentally clicked on something they didn’t mean to.&lt;/p&gt;
&lt;p&gt;In Angular 2 detecting this route change is relatively simple. If we have a
component that is transient across all routes in our application then we can
have it subscribe to our router for any changes and act upon these changes as we
wish to.&lt;/p&gt;</description></item><item><title>Angular Websockets Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-websockets-tutorial/</link><pubDate>Sun, 09 Apr 2017 20:52:33 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-websockets-tutorial/</guid><description>&lt;p&gt;In this tutorial we’ll be looking at how you can implement a very simple
WebSockets based Angular application.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;You may also be interested in my tutorial:
&lt;a href="./typescript/angular/angular-socket-io-tutorial/"
 title="Creating a Realtime App with Angular and Socket.io" 
 &gt;
 Creating a Realtime App with Angular and Socket.io&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="video-tutorial"&gt;
 &lt;a href="#video-tutorial" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Video Tutorial&lt;/h2&gt;
&lt;div style="position:relative;height:0;padding-bottom:42.76%"&gt;&lt;iframe src="https://www.youtube.com/embed/8CNVYWiR5fg?ecver=2" style="position:absolute;width:100%;height:100%;left:0" width="842" height="360" frameborder="0" allow="autoplay; encrypted-media" allowfullscreen&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;h2 id="browser-compatibility"&gt;
 &lt;a href="#browser-compatibility" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Browser Compatibility&lt;/h2&gt;
&lt;p&gt;At this point in time I think it would be a good idea to let you know that
websocket browser compatibility is not 100% and some older browsers may not
support WebSockets. This tutorial, as a result, may not work in your browser if
you haven’t updated in awhile.&lt;/p&gt;</description></item><item><title>Creating a Realtime App with Angular and Socket.io Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-socket-io-tutorial/</link><pubDate>Tue, 10 Jan 2017 15:26:02 +0100</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-socket-io-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;The full source code for this tutorial can be found here:
&lt;a href="https://github.com/elliotforbes/angular-socket-io-example"
 title="elliotforbes/angular-socket-io-example" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 elliotforbes/angular-socket-io-example&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;In this tutorial we are going to be looking at how we can build a realtime
application using both Angular 4 and the Socket.io library. I&amp;rsquo;ve covered in the
past how you can utilize raw websockets and convert them into observables using
the RxJS library in a previous tutorial which can be found here:
&lt;a href="./typescript/angular/angular-websockets-tutorial/"
 title="Angular Websockets Tutorial" 
 &gt;
 Angular Websockets Tutorial&lt;/a&gt;&lt;/p&gt;</description></item><item><title>Angular Cookies Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-cookies-tutorial/</link><pubDate>Sun, 14 Feb 2016 16:11:58 +0530</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-cookies-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Angular 2.2.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Cookies are small packages of information that are typically stored by your
browser and websites tend to use cookies for multiple things. Cookies persist
across multiple requests and browser sessions should you set them to and they
can be a great method for authentication in some web apps.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Check out my AngularJS 1.* tutorial on
&lt;a href="./javascript/angularjs/angularjs-store-cookies-tutorial/"
 title="storing information in cookies" 
 &gt;
 storing information in cookies&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="limitations-of-cookies"&gt;
 &lt;a href="#limitations-of-cookies" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Limitations of Cookies&lt;/h2&gt;
&lt;p&gt;Typically we can only store no more than 20 cookies per web server and no more
than 4KB of information in each cookie and they can last indefinitely should you
choose to specify the max-age attribute.&lt;/p&gt;</description></item><item><title>Angular Multiple Environment Configuration Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-environment-configuration-tutorial/</link><pubDate>Sun, 14 Feb 2016 16:11:58 +0530</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-environment-configuration-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This Tutorial is part of the Angular Fundamentals course which can be found
here:
&lt;a href="https://tutorialedge.net/course/angular/"
 title="Angular Fundamentals" 
 class="underline" target="_blank" rel="noopener noreferrer"&gt;
 Angular Fundamentals&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;If you are developing serious applications there is a very good chance that you
will have more than one environment. You’ll have at least one testing
environment to harmlessly break things in and a polished production environment
that is supposed to remain as stable as possible.&lt;/p&gt;
&lt;p&gt;Angular, or more specifically the angular-cli provides a very good mechanism for
having multiple differing configuration files and for building these files
easily into your finished build artefacts.&lt;/p&gt;</description></item><item><title>Angular Observables Tutorial using RxJS</title><link>https://tutorialedge.net/typescript/angular/angular-observables-tutorial/</link><pubDate>Sun, 14 Feb 2016 16:11:58 +0530</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-observables-tutorial/</guid><description>&lt;p&gt;The Observable Design pattern is an incredibly powerful paradigm that we can
utilize in a wide array of different applications. In this tutorial we’ll be
covering how you can implement your own observables in Angular.&lt;/p&gt;
&lt;h2 id="rxjs"&gt;
 &lt;a href="#rxjs" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;RxJS&lt;/h2&gt;
&lt;p&gt;RxJS or reactive extensions is a set of libraries that are designed to help
implement asynchronous and event-based programs and it’s necessary if you are
wanting to perform Http requests or work with streams of information in Angular
applications.&lt;/p&gt;</description></item><item><title>Angular Routing Tutorial</title><link>https://tutorialedge.net/typescript/angular/angular-routing-tutorial/</link><pubDate>Sun, 14 Feb 2016 16:11:58 +0530</pubDate><guid>https://tutorialedge.net/typescript/angular/angular-routing-tutorial/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Angular 2.2. Some of the code samples may not
work if you are using previous versions&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Routing is practically essential in all larger Angular applications, it provides
us with the ability to show different sections of html within a master template
and basically create a full-blown multi-page application.&lt;/p&gt;
&lt;p&gt;Routing in Angular 2+ has changed dramatically from the original AngularJS days
where you would have to utilize the $routeProvider and typically define routes
in a separate file to that of your module file.&lt;/p&gt;</description></item><item><title>Migrating to Hugo</title><link>https://tutorialedge.net/blog/migrating-to-hugo/</link><pubDate>Sun, 14 Feb 2016 16:11:58 +0530</pubDate><guid>https://tutorialedge.net/blog/migrating-to-hugo/</guid><description>&lt;p&gt;If you&amp;rsquo;ve frequented this site in the past you should hopefully have noticed a
huge change to the way the site looks and hopefully the speed at which the site
serves content. Over the past 2 weeks I&amp;rsquo;ve been working with a static site tool,
similar to that of Jekyll, called Hugo.&lt;/p&gt;
&lt;h2 id="reasons-for-the-migration"&gt;
 &lt;a href="#reasons-for-the-migration" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Reasons for the Migration&lt;/h2&gt;
&lt;h3 id="ease"&gt;
 &lt;a href="#ease" class="heading-anchor" aria-hidden="true"&gt;###&lt;/a&gt;Ease&lt;/h3&gt;
&lt;p&gt;The first and biggest reason I&amp;rsquo;m moving to a github based site is due to the
ease with which I can make changes. I was writing in markdown with the old
system so the writing style isn&amp;rsquo;t going to change and leveraging the power of
github when it comes to revision history is fantastic.&lt;/p&gt;</description></item><item><title>Removing Duplicate Entries from ng-repeat in AngularJS</title><link>https://tutorialedge.net/javascript/angularjs/removing-duplicates-from-ng-repeat/</link><pubDate>Sun, 14 Feb 2016 16:11:58 +0530</pubDate><guid>https://tutorialedge.net/javascript/angularjs/removing-duplicates-from-ng-repeat/</guid><description>&lt;blockquote&gt;
&lt;p&gt;This tutorial was built using Angular 1.6. Earlier or later versions of the
code may not work as intended.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This tutorial will show you how you can filter out duplicates when using the
ng-repeat directive in AngularJS. We&amp;rsquo;ll be passing in an array of JSON Objects
and filtering based on multiple different things within each object.&lt;/p&gt;
&lt;h2 id="implementing-our-test-controller"&gt;
 &lt;a href="#implementing-our-test-controller" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Implementing our Test Controller&lt;/h2&gt;
&lt;p&gt;We’ll start off with a very simple angular controller that will have a list of item names, some of which are duplicates.&lt;/p&gt;</description></item><item><title>The Top Books for Learning to Program in Python</title><link>https://tutorialedge.net/python/best-books-for-python/</link><pubDate>Sun, 14 Feb 2016 16:11:58 +0530</pubDate><guid>https://tutorialedge.net/python/best-books-for-python/</guid><description>&lt;p&gt;Python is one of the most popular programming languages on the planet. It’s
widely regarded as one of the best languages to learn first if you are wanting
to get into computer programming.&lt;/p&gt;
&lt;h2 id="dive-into-python"&gt;
 &lt;a href="#dive-into-python" class="heading-anchor" aria-hidden="true"&gt;##&lt;/a&gt;Dive Into Python&lt;/h2&gt;
&lt;div class="amazon-link"&gt;Amazon: &lt;a href="https://www.amazon.com/Dive-into-Python-Mark-Pilgrim/dp/1430224150/ref=as_li_ss_tl?ie=UTF8&amp;qid=1483302655&amp;sr=8-1&amp;keywords=dive+into+python&amp;linkCode=ll1&amp;tag=gadgetedgecom-20&amp;linkId=4bc988ee5a4ddbdeffb417649e407e21"&gt;Dive Into Python&lt;/a&gt;&lt;/div&gt;
&lt;p&gt;Dive into Python is a perfect hands-on guide for experienced programmers to come
to grips with the Python programming language. It&amp;rsquo;s succinct in the way it
delivers its content and is an excellent reference book that&amp;rsquo;s definitely handy
to have close at hand when programming.&lt;/p&gt;</description></item></channel></rss>