<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Jefferson Otoni Lima</title>
    <description>The latest articles on Forem by Jefferson Otoni Lima (@jeffotoni).</description>
    <link>https://forem.com/jeffotoni</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F249245%2Fc0cdc5cd-628e-4686-a04a-8958c33d1211.jpeg</url>
      <title>Forem: Jefferson Otoni Lima</title>
      <link>https://forem.com/jeffotoni</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/jeffotoni"/>
    <language>en</language>
    <item>
      <title>Quick Framework and some Performance Improvements</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Sun, 05 Oct 2025 17:17:37 +0000</pubDate>
      <link>https://forem.com/jeffotoni/quick-framework-and-some-performance-improvements-1949</link>
      <guid>https://forem.com/jeffotoni/quick-framework-and-some-performance-improvements-1949</guid>
      <description>&lt;p&gt;I'm very excited to share more improvements implemented in the Quick Framework, developed by &lt;a href="https://github.com/jeffotoni" rel="noopener noreferrer"&gt;@jeffotoni&lt;/a&gt;. These updates focus on robustness, performance, and support for modern protocols.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Early mornings improving Quick&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As we're using Quick for an AI (Artificial Intelligence) communication project, several needs have emerged that have led to new implementations and improvements to Quick. So, I'll present some improvements made this week.&lt;/p&gt;

&lt;p&gt;There's nothing better than putting a framework to the test in practice, and it's fascinating! I'm using it in AI projects, developing native servers to orchestrate flows with LLMs, creating custom connectors, and continuously building RAG solutions. It's been a challenging yet very exciting experience.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reflections from a curious developer&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The path is arduous, long, but &lt;strong&gt;incredibly enjoyable&lt;/strong&gt;. I'm driven by curiosity, and sometimes I can't contain myself. I need to study again, revisit something that was right there with me all along, but only now makes sense, you know? It wasn't the right moment before, perhaps, but it was there, so close and yet so distant. And this belated discovery intrigues me even more.&lt;/p&gt;

&lt;p&gt;Despite years of practice and development, I often feel as if I'm seeing the world of technology through a crack, like someone peeking at the "whole" through a keyhole. Reality seems fragmented; we only access bits and pieces, flashes, never the complete whole, and that's intriguing. And perhaps we'll never truly see it.&lt;/p&gt;

&lt;p&gt;That's why I decided to create these posts, not only to show in practice what was done for the Quick framework, but also to share some sincere reflections from a developer constantly learning.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was implemented?&lt;/strong&gt; 😁&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Duplicate WriteHeader Protection&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We implemented a custom wrapper (responseWriter) that prevents "&lt;strong&gt;superfluous&lt;/strong&gt; response.WriteHeader" errors. Now, multiple calls to WriteHeader are handled silently, avoiding crashes in complex middleware chains.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Hijacker Support&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The responseWriter now implements the &lt;strong&gt;http.Hijacker&lt;/strong&gt; interface, allowing connection upgrades natively. This enables real-time bidirectional communication directly through Quick.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. HTTP/2 Server Push&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We added support for the &lt;strong&gt;http.Pusher&lt;/strong&gt; interface with the c.Pusher() method, enabling HTTP/2 Server Push to improve performance by proactively sending resources to the client before they are even requested, reducing latency and round-trips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;quick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pusher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pusher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;pusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/static/style.css"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/static/app.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Simplified Server-Sent Events (SSE) for Streaming LLMs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We implemented the c.Flusher() method, which facilitates real-time data streaming, essential for modern applications with Large Language Models (LLMs). It allows you to progressively send tokens as they are generated, creating interactive experiences in both the browser and CLIs.&lt;/p&gt;

&lt;p&gt;Real-world use cases:&lt;br&gt;
Streaming responses from ChatGPT, Claude, and Gemini&lt;br&gt;
Real-time deployment logs&lt;br&gt;
Progressive dashboard updates&lt;br&gt;
Server push notifications&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example 1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/ai/chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;quick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"text/event-stream"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cache-Control"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"no-cache"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Connection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"keep-alive"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flusher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Streaming not supported"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Simulate streaming of tokens the LLM&lt;/span&gt;
    &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" this"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" is"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" streaming"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" response"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" from"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" AI"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Standard SSE format&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data: %s&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// Sends immediately to the customer&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Millisecond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Simulates LLM latency&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Signals end of stream&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data: [DONE]&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Example 2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/events"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;quick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"text/event-stream"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cache-Control"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"no-cache"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flusher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Streaming not supported"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data: Message %d&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Client JavaScript (Browser):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/ai/chat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[DONE]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;response&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Client CLI (Go):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:8080/ai/chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;bufio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[DONE]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data: "&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It works perfectly with HTTP/2 multiplexing, allowing multiple simultaneous streams on the same connection.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Pooling Optimization&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Reset()&lt;/strong&gt; method has been optimized to reuse the existing wrapper instead of recreating it with each request. This reduces memory allocations in the hot path, improving throughput.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Memory Leak Prevention&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;We implemented full context cleanup in &lt;strong&gt;releaseCtx()&lt;/strong&gt;, including Context and wroteHeader fields, ensuring that no residual state remains between requests.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impact&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Greater robustness in high-concurrency scenarios&lt;br&gt;
✅ Native HTTP/2 support&lt;br&gt;
✅ Server-Sent Events (SSE) made easy with c.Flusher()&lt;br&gt;
✅ Reduced allocations per request&lt;br&gt;
✅ Zero breaking changes and 100% backward compatibility&lt;/p&gt;

&lt;p&gt;All changes maintain full compatibility with existing code.&lt;/p&gt;
&lt;h3&gt;
  
  
  🆚 SSE vs WebSocket
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Appearance&lt;/th&gt;
&lt;th&gt;SSE&lt;/th&gt;
&lt;th&gt;WebSocket&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server CPU&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Low&lt;/td&gt;
&lt;td&gt;🟡 Medium&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Server Memory&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 2-4 KB/connection&lt;/td&gt;
&lt;td&gt;🟡 8-16 KB/connection&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bandwidth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Lower overhead&lt;/td&gt;
&lt;td&gt;🟡 Higher overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latency&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟡 ~50 ms&lt;/td&gt;
&lt;td&gt;🟢 ~5-10 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Implementation&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Simple&lt;/td&gt;
&lt;td&gt;🟡 Complex&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Debugging&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 HTTP Tools&lt;/td&gt;
&lt;td&gt;🔴 Specific Tools&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firewall/Proxy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Standard HTTP&lt;/td&gt;
&lt;td&gt;🟡 Power Issues&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bidirectional&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔴 No (server-client only)&lt;/td&gt;
&lt;td&gt;🟢 Yes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Protocol&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP/1.1 or HTTP/2&lt;/td&gt;
&lt;td&gt;WebSocket (RFC 6455)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Plain Text&lt;/td&gt;
&lt;td&gt;Binary Frames&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Handshake&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Normal HTTP Request&lt;/td&gt;
&lt;td&gt;HTTP Refresh&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Automatic Reconnect&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Yes (native)&lt;/td&gt;
&lt;td&gt;🔴 Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Browser Support&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 All modern&lt;/td&gt;
&lt;td&gt;🟢 All modern&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Message Overhead&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~45 bytes&lt;/td&gt;
&lt;td&gt;~50+ bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ideal for&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Notifications, feeds, logs&lt;/td&gt;
&lt;td&gt;Chat, games, collaboration&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Scalability&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 I have ~10,000 connections&lt;/td&gt;
&lt;td&gt;🟢 Thousands of Connections&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CDN Compatible&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Yes&lt;/td&gt;
&lt;td&gt;🟡 Limited&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Backend Complexity&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Low&lt;/td&gt;
&lt;td&gt;🟡 High&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  📊 Performance Comparison - SSE Writing Methods
&lt;/h3&gt;

&lt;p&gt;This benchmark was run to identify the most efficient method for detecting SSE events unrelated to http.ResponseWriter. Tests were performed on an Apple M3 Max with Go 1.x, measuring nanoseconds per operation (ns/op), bytes allocated (B/op), and number of allocations (allocs/op).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Benchmark Results&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The w.Write([]byte()) method performs best with 13.56 ns/op and zero allocations, approximately 4x faster than fmt.Fprint() and 9x faster than io.WriteString().&lt;/p&gt;

&lt;p&gt;For large messages (&amp;gt;1 KB), it is recommended to use sync.Pool to reuse buffers, reducing allocation and putting pressure on the garbage collector.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recommendations&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Development/Debugging: Use fmt.Fprint() for simplicity.&lt;br&gt;
Production (small messages): Use w.Write([]byte()) for maximum performance.&lt;br&gt;
Production (large messages): Use sync.Pool with reused buffers.&lt;br&gt;
High performance (&amp;gt;10,000 requests/s): Combine w.Write() with a buffer pool.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The full benchmark is available in &lt;code&gt;/bench&lt;/code&gt;.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;th&gt;Allocations&lt;/th&gt;
&lt;th&gt;Complexity&lt;/th&gt;
&lt;th&gt;Recommendation&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fmt.Fprint()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟡 Medium (53 ns)&lt;/td&gt;
&lt;td&gt;3 allocations&lt;/td&gt;
&lt;td&gt;🟢 Simple&lt;/td&gt;
&lt;td&gt;✅ Development&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;io.WriteString()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟡 Slow (116 ns)&lt;/td&gt;
&lt;td&gt;1 allocation&lt;/td&gt;
&lt;td&gt;🟢 Simple&lt;/td&gt;
&lt;td&gt;⚠️ Avoid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;w.Write([]byte)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟢🟢 Excellent (13 ns)&lt;/td&gt;
&lt;td&gt;0 allocations&lt;/td&gt;
&lt;td&gt;🟢 Simple&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Throughput&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strings.Builder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟡 Slow (124 ns)&lt;/td&gt;
&lt;td&gt;1-2 allocations&lt;/td&gt;
&lt;td&gt;🟡 Media&lt;/td&gt;
&lt;td&gt;⚠️ Avoid&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Multiple Writes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟢 Good (21 ns)&lt;/td&gt;
&lt;td&gt;0 allocations&lt;/td&gt;
&lt;td&gt;🟢 Simple&lt;/td&gt;
&lt;td&gt;✅ Alternative&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sync.Pool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟢🟢 Excellent (40 ns)&lt;/td&gt;
&lt;td&gt;0 allocations&lt;/td&gt;
&lt;td&gt;🔴 Complex&lt;/td&gt;
&lt;td&gt;✅ High-performance&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Unsafe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟢🟢 Excellent (21 ns)&lt;/td&gt;
&lt;td&gt;0 allocations&lt;/td&gt;
&lt;td&gt;🔴 Complex&lt;/td&gt;
&lt;td&gt;⚠️ Experts&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  🚀 Running the Benchmark
&lt;/h2&gt;

&lt;p&gt;To reproduce the performance tests and validate the results on your machine, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-bench&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-benchtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1s &lt;span class="nt"&gt;-benchmem&lt;/span&gt; ctx_bench_test.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Benchmark Parameters
&lt;/h3&gt;

&lt;p&gt;-bench=. - Run all benchmarks&lt;br&gt;
-benchtime=1s - Run each benchmark for 1 second&lt;br&gt;
-benchmem - Include memory allocation statistics&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Benchmark Results
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Test Environment:
&lt;/h4&gt;

&lt;p&gt;OS: macOS (darwin)&lt;br&gt;
Architecture: ARM64&lt;br&gt;
CPU: Apple M3 Max&lt;br&gt;
Go Version: 1.x&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;ns/op&lt;/th&gt;
&lt;th&gt;ops/sec&lt;/th&gt;
&lt;th&gt;B/op&lt;/th&gt;
&lt;th&gt;allocs/op&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WriteBytes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13.32&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75.1M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🥇 &lt;strong&gt;Winner&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MultipleWrites&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20.68&lt;/td&gt;
&lt;td&gt;48.4M&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;🥈 Excellent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Unsafe&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20.98&lt;/td&gt;
&lt;td&gt;47.7M&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;🥉 Great&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Pooled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;39.00&lt;/td&gt;
&lt;td&gt;25.6M&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;✅ Good&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FmtFprint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;52.69&lt;/td&gt;
&lt;td&gt;19.0M&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;⚠️ Slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FmtFprintf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;62.61&lt;/td&gt;
&lt;td&gt;16.0 million&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;⚠️ Slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IoWriteString&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;111.6&lt;/td&gt;
&lt;td&gt;9.0 million&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 Very slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Optimized&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;119.7&lt;/td&gt;
&lt;td&gt;8.4 million&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 Very slow&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;StringsBuilder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;122.7&lt;/td&gt;
&lt;td&gt;8.2 million&lt;/td&gt;
&lt;td&gt;1032&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;🔴 Very slow&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Method&lt;/th&gt;
&lt;th&gt;ns/op&lt;/th&gt;
&lt;th&gt;Speedup&lt;/th&gt;
&lt;th&gt;B/op&lt;/th&gt;
&lt;th&gt;allocs/op&lt;/th&gt;
&lt;th&gt;Performance&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PooledLarge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;234.5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Baseline&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🥇 &lt;strong&gt;Winner&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WriteBytesLarge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;811.2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3.46x slower&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9472&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 Much Slower&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Examples and Source Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;All tests can be accessed here -&amp;gt; &lt;a href="https://github.com/jeffotoni/quick/tree/main/example/quick.sse" rel="noopener noreferrer"&gt;Quick SSE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here you can view the Bench source code &lt;a href="https://github.com/jeffotoni/quick/blob/main/ctx_bench_test.go" rel="noopener noreferrer"&gt;bench&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contributions&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quick is an open-source project in constant evolution. Feedback and contributions are always welcome!&lt;br&gt;
GitHub: &lt;a href="//github.com/jeffotoni/quick"&gt;Quick&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  golang #webframework #performance #opensource #go #quick
&lt;/h1&gt;

</description>
      <category>rag</category>
      <category>ai</category>
      <category>performance</category>
      <category>llm</category>
    </item>
    <item>
      <title>Quick Framework e algumas Melhorias de Performance</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Sat, 04 Oct 2025 17:08:02 +0000</pubDate>
      <link>https://forem.com/jeffotoni/quick-framework-algumas-melhorias-de-performance-42af</link>
      <guid>https://forem.com/jeffotoni/quick-framework-algumas-melhorias-de-performance-42af</guid>
      <description>&lt;p&gt;Muito feliz em compartilhar mais melhorias implementadas no &lt;strong&gt;Quick&lt;/strong&gt; Framework, desenvolvido por &lt;a href="https://github.com/jeffotoni" rel="noopener noreferrer"&gt;@jeffotoni&lt;/a&gt;. Essas atualizações focam em robustez, performance e suporte a protocolos modernos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Madrugadas melhorando o Quick&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Como estamos usando o &lt;a href="https://github.com/jeffotoni/quick" rel="noopener noreferrer"&gt;Quick&lt;/a&gt; para projeto de comunicação com IA(Inteligência Artificial) apareceu diversas necessidades que levaram a novas implementações e melhorias no &lt;a href="https://github.com/jeffotoni/quick" rel="noopener noreferrer"&gt;Quick&lt;/a&gt;. Então vou apresentar algumas melhorias que foram feitas essa semana.&lt;/p&gt;

&lt;p&gt;Nada melhor do que colocar um framework à prova na prática e isso é fascinante! Estou utilizando em projetos de IA, desenvolvendo servidores nativos para orquestrar fluxos com LLMs, criando conectores personalizados e construindo soluções RAG continuamente. Tem sido uma experiência desafiadora e ao mesmo tempo muito empolgante.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reflexões de um desenvolvedor curioso&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O caminho é árduo, longo, mas &lt;strong&gt;incrivelmente prazeroso&lt;/strong&gt;. Sou movido pela curiosidade e, às vezes, não me contenho, preciso estudar de novo, revisitar algo que estava ali ao meu lado o tempo todo, mas que só agora faz sentido, entende?. Não era o momento antes, talvez mas estava ali tão perto e ao mesmo tempo tão distante. E essa descoberta tardia me intriga ainda mais.&lt;/p&gt;

&lt;p&gt;Apesar dos anos de prática e desenvolvimento, frequentemente me sinto como se estivesse vendo o universo da tecnologia por uma fresta como quem espreita o &lt;strong&gt;“todo”&lt;/strong&gt; pela fechadura de uma porta. A realidade parece fragmentada acessamos apenas pedaços, flashes, nunca o todo completo e isso é intrigante. E talvez nunca o vejamos de fato.&lt;/p&gt;

&lt;p&gt;Foi por isso que resolvi criar estes posts não somente para mostrar na prática o que foi feito para &lt;strong&gt;framework Quick&lt;/strong&gt; mas algumas &lt;strong&gt;reflexões sinceras de um desenvolvedor em constante aprendizado.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que foi implementado? 😁&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Proteção contra WriteHeader Duplicado&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementamos um wrapper customizado (responseWriter) que previne erros de "&lt;strong&gt;superfluous&lt;/strong&gt; response.WriteHeader". Agora, múltiplas chamadas a WriteHeader são tratadas silenciosamente, evitando crashes em chains complexas de middleware.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Suporte Hijacker&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O responseWriter agora implementa a interface &lt;strong&gt;http.Hijacker&lt;/strong&gt;, permitindo upgrades de conexão de forma nativa. Isso habilita comunicação bidirecional em tempo real diretamente através do Quick.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. HTTP/2 Server Push&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adicionamos suporte à interface &lt;strong&gt;http.Pusher&lt;/strong&gt; com método c.Pusher(), habilitando HTTP/2 Server Push para melhorar performance ao enviar recursos proativamente ao cliente antes mesmo deles serem requisitados, reduzindo latência e round-trips.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;quick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pusher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pusher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;pusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/static/style.css"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;pusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Push&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/static/app.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;200&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"&amp;lt;html&amp;gt;...&amp;lt;/html&amp;gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;4. Server-Sent Events(SSE) Simplificado para Streaming de LLMs&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementamos o método &lt;strong&gt;c.Flusher()&lt;/strong&gt; que facilita streaming de dados em tempo real, essencial para aplicações modernas com &lt;strong&gt;LLMs&lt;/strong&gt; (Large Language Models). Permite enviar tokens progressivamente conforme são gerados, criando experiências interativas tanto no browser quanto em CLIs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Casos de uso reais:&lt;/strong&gt;&lt;br&gt;
Streaming de respostas de &lt;strong&gt;ChatGPT, Claude, Gemini&lt;/strong&gt;&lt;br&gt;
Logs em tempo real de deployments&lt;br&gt;
Atualizações progressivas de dashboards&lt;br&gt;
Notificações push do servidor&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo1:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/ai/chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;quick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"text/event-stream"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cache-Control"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"no-cache"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Connection"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"keep-alive"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flusher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Streaming not supported"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Simula streaming de tokens de uma LLM&lt;/span&gt;
    &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"Hello"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" this"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" is"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" streaming"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" response"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" from"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" AI"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;tokens&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c"&gt;// Formato SSE padrão&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data: %s&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;token&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="c"&gt;// Envia imediatamente ao cliente&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;100&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Millisecond&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// Simula latência da LLM&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Sinaliza fim do stream&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data: [DONE]&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Exemplo2:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;q&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/events"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;func&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;quick&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ctx&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Content-Type"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"text/event-stream"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Set&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Cache-Control"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"no-cache"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flusher&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;ok&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;500&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SendString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Streaming not supported"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="m"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data: Message %d&lt;/span&gt;&lt;span class="se"&gt;\n\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;flusher&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Flush&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cliente JavaScript (Browser):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;eventSource&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;EventSource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/ai/chat&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;onmessage&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;[DONE]&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="nx"&gt;eventSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;close&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="nb"&gt;document&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getElementById&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;response&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;innerText&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="nx"&gt;event&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Cliente CLI (Go):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"http://localhost:8080/ai/chat"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"application/json"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;reader&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;bufio&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewReader&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;resp&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;reader&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ReadString&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sc"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Contains&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"[DONE]"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;break&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strings&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;TrimPrefix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;line&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"data: "&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Funciona perfeitamente com HTTP/2 multiplexing, permitindo múltiplos streams simultâneos na mesma conexão.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;5. Otimização de Pooling&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O método &lt;strong&gt;Reset()&lt;/strong&gt; foi otimizado para reusar o wrapper existente ao invés de recriá-lo a cada requisição. Isso reduz alocações de memória no hot path, melhorando throughput.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;6. Prevenção de Memory Leaks&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Implementamos limpeza completa de contexto no &lt;strong&gt;releaseCtx()&lt;/strong&gt;, incluindo campos Context e wroteHeader, garantindo que nenhum state residual permaneça entre requisições.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Impacto&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ Maior robustez em cenários de alta concorrência&lt;br&gt;
✅ Suporte nativo a HTTP/2&lt;br&gt;
✅ Server-Sent Events (SSE) facilitado com c.Flusher()&lt;br&gt;
✅ Redução de alocações por requisição&lt;br&gt;
✅ Zero breaking changes e 100% retrocompatível&lt;/p&gt;

&lt;p&gt;Todas as mudanças mantêm compatibilidade total com código existente.&lt;/p&gt;
&lt;h3&gt;
  
  
  🆚 SSE vs WebSocket
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Aparência&lt;/th&gt;
&lt;th&gt;SSE&lt;/th&gt;
&lt;th&gt;WebSocket&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;CPU do Servidor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Baixa&lt;/td&gt;
&lt;td&gt;🟡 Média&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Memória do Servidor&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 2-4 KB/conexão&lt;/td&gt;
&lt;td&gt;🟡 8-16 KB/conexão&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Comprimento de Banda&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Menor overhead&lt;/td&gt;
&lt;td&gt;🟡Maior overhead&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Latência&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟡 ~50 ms&lt;/td&gt;
&lt;td&gt;🟢 ~5-10 ms&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Implementação&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Simples&lt;/td&gt;
&lt;td&gt;🟡 Complexa&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Depuração&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Ferramentas HTTP&lt;/td&gt;
&lt;td&gt;🔴 Ferramentas específicas&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Firewall/Proxy&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 HTTP padrão&lt;/td&gt;
&lt;td&gt;🟡 Problemas de energia&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Bidirecional&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🔴 Não (apenas servidor→cliente)&lt;/td&gt;
&lt;td&gt;🟢 Sim&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Protocolo&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;HTTP/1.1 ou HTTP/2&lt;/td&gt;
&lt;td&gt;WebSocket (RFC 6455)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Parser&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Texto simples&lt;/td&gt;
&lt;td&gt;Quadros binários&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Handshake&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Solicitação HTTP normal&lt;/td&gt;
&lt;td&gt;Atualização HTTP&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Reconexão automática&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Sim (nativo)&lt;/td&gt;
&lt;td&gt;🔴 Manual&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Suporte a navegadores&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Todos os modernos&lt;/td&gt;
&lt;td&gt;🟢 Todos os modernos&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Sobrecarga por Mensagem&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;~45 bytes&lt;/td&gt;
&lt;td&gt;~50+ bytes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Ideal para&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Notificações, feeds, logs&lt;/td&gt;
&lt;td&gt;Bate-papo, jogos, colaboração&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Escalabilidade&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Tenho ~10 mil conexões&lt;/td&gt;
&lt;td&gt;🟢 Milhares de conexões&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Compatível com CDN&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Sim&lt;/td&gt;
&lt;td&gt;🟡 Limitado&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Complexidade do Backend&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🟢 Baixa&lt;/td&gt;
&lt;td&gt;🟡 Alta&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h3&gt;
  
  
  📊 Comparação de Desempenho - Métodos de Escrita SSE
&lt;/h3&gt;

&lt;p&gt;Este benchmark foi executado para identificar o método mais eficiente de detecção de eventos SSE não relacionados a http.ResponseWriter. Os testes foram realizados em um Apple M3 Max com Go 1.x, medindo nanossegundos por operação (ns/op), bytes alocados (B/op) e número de alocações (allocs/op).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Resultado do Benchmark&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O método w.Write([]byte()) apresenta melhor desempenho com &lt;strong&gt;13,56 ns/op e zero alocações,&lt;/strong&gt; sendo aproximadamente 4x mais rápido que fmt.Fprint() e 9x mais rápido que &lt;strong&gt;io.WriteString().&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Para mensagens grandes &lt;strong&gt;(&amp;gt;1 KB)&lt;/strong&gt;, recomenda-se usar &lt;strong&gt;sync.Pool&lt;/strong&gt; para reutilizar buffers, reduzindo a alocação e pressionando o coletor de lixo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Recomendações&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Desenvolvimento/Depuração use fmt.Fprint() para simplificar&lt;br&gt;
Produção (mensagens pequenas) use w.Write([]byte()) para desempenho máximo.&lt;br&gt;
Produção (mensagens grandes) use sync.Pool com buffers reutilizados&lt;br&gt;
Alto desempenho (&amp;gt;10 mil req/s): Combine w.Write() com buffer pool&lt;/p&gt;

&lt;p&gt;O benchmark completo está disponível em &lt;code&gt;/bench&lt;/code&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Método&lt;/th&gt;
&lt;th&gt;Desempenho&lt;/th&gt;
&lt;th&gt;Alocações&lt;/th&gt;
&lt;th&gt;Complexidade&lt;/th&gt;
&lt;th&gt;Recomendação&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;fmt.Fprint()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟡 Médio (53 ns)&lt;/td&gt;
&lt;td&gt;3 alocações&lt;/td&gt;
&lt;td&gt;🟢 Simples&lt;/td&gt;
&lt;td&gt;✅ Desenvolvimento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;io.WriteString()&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟡 Lento (116 ns)&lt;/td&gt;
&lt;td&gt;1 alocação&lt;/td&gt;
&lt;td&gt;🟢 Simples&lt;/td&gt;
&lt;td&gt;⚠️ Evite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;w.Write([]byte)&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟢🟢 Excelente (13 ns)&lt;/td&gt;
&lt;td&gt;0 alocações&lt;/td&gt;
&lt;td&gt;🟢 Simples&lt;/td&gt;
&lt;td&gt;✅ &lt;strong&gt;Produção&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;strings.Builder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟡 Lento (124 ns)&lt;/td&gt;
&lt;td&gt;1-2 alocações&lt;/td&gt;
&lt;td&gt;🟡 Mídia&lt;/td&gt;
&lt;td&gt;⚠️ Evitar&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Múltiplas Gravações&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟢 Boa (21 ns)&lt;/td&gt;
&lt;td&gt;0 alocações&lt;/td&gt;
&lt;td&gt;🟢 Simples&lt;/td&gt;
&lt;td&gt;✅ Alternativo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sync.Pool&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟢🟢 Excelente (40 ns)&lt;/td&gt;
&lt;td&gt;0 alocações&lt;/td&gt;
&lt;td&gt;🔴 Complexa&lt;/td&gt;
&lt;td&gt;✅ Alto desempenho&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Inseguro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;🟢🟢 Excelente (21 ns)&lt;/td&gt;
&lt;td&gt;0 alocações&lt;/td&gt;
&lt;td&gt;🔴 Complexa&lt;/td&gt;
&lt;td&gt;⚠️ Especialistas&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;h2&gt;
  
  
  🚀 Executando o Benchmark
&lt;/h2&gt;

&lt;p&gt;Para reproduzir os testes de desempenho e validar os resultados em sua máquina, execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go &lt;span class="nb"&gt;test&lt;/span&gt; &lt;span class="nt"&gt;-bench&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;-benchtime&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1s &lt;span class="nt"&gt;-benchmem&lt;/span&gt; ctx_bench_test.go
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Parâmetros do Benchmark
&lt;/h3&gt;

&lt;p&gt;-bench=. - Executar todos os benchmarks&lt;br&gt;
-benchtime=1s - Executar cada benchmark por 1 segundo&lt;br&gt;
-benchmem - Incluir estatísticas de alocação de memória&lt;/p&gt;

&lt;h3&gt;
  
  
  📊 Resultados do Benchmark
&lt;/h3&gt;

&lt;h4&gt;
  
  
  Ambiente de Teste:
&lt;/h4&gt;

&lt;p&gt;SO: macOS (darwin)&lt;br&gt;
Arquitetura: ARM64&lt;br&gt;
CPU: Apple M3 Max&lt;br&gt;
Versão Go: 1.x&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Método&lt;/th&gt;
&lt;th&gt;ns/op&lt;/th&gt;
&lt;th&gt;ops/seg&lt;/th&gt;
&lt;th&gt;B/op&lt;/th&gt;
&lt;th&gt;allocs/op&lt;/th&gt;
&lt;th&gt;Desempenho&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WriteBytes&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;13,32&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;75,1M&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🥇 &lt;strong&gt;Vencedor&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;MultipleWrites&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20,68&lt;/td&gt;
&lt;td&gt;48,4M&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;🥈 Excelente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Inseguro&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;20,98&lt;/td&gt;
&lt;td&gt;47,7 milhões&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;🥉 Ótimo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Pooled&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;39,00&lt;/td&gt;
&lt;td&gt;25,6 milhões&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;✅ Bom&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FmtFprint&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;52,69&lt;/td&gt;
&lt;td&gt;19,0 milhões&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;⚠️ Lento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;FmtFprintf&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;62,61&lt;/td&gt;
&lt;td&gt;16,0 milhões&lt;/td&gt;
&lt;td&gt;16&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;⚠️ Lento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;IoWriteString&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;111,6&lt;/td&gt;
&lt;td&gt;9,0 milhões&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 Muito lento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;Otimizado&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;119,7&lt;/td&gt;
&lt;td&gt;8,4 milhões&lt;/td&gt;
&lt;td&gt;1024&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 Muito lento&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;StringsBuilder&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;122,7&lt;/td&gt;
&lt;td&gt;8,2 milhões&lt;/td&gt;
&lt;td&gt;1032&lt;/td&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;🔴 Muito Lento&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Método&lt;/th&gt;
&lt;th&gt;ns/op&lt;/th&gt;
&lt;th&gt;Aceleração&lt;/th&gt;
&lt;th&gt;B/op&lt;/th&gt;
&lt;th&gt;allocs/op&lt;/th&gt;
&lt;th&gt;Desempenho&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;PooledLarge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;234,5&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Linha de Base&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;🥇 &lt;strong&gt;Vencedor&lt;/strong&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;WriteBytesLarge&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;811,2&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3,46x mais lento&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;9472&lt;/td&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;🔴 Muito Mais Lento&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Exemplos e código fonte&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Todos os testes pode ser acessados aqui -&amp;gt; &lt;a href="https://github.com/jeffotoni/quick/tree/main/example/quick.sse" rel="noopener noreferrer"&gt;Quick SSE&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui você consegue visualizar o codigo fonte do Bench &lt;a href="https://github.com/jeffotoni/quick/blob/main/ctx_bench_test.go" rel="noopener noreferrer"&gt;bench&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Contribuições&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Quick é um projeto &lt;strong&gt;open-source&lt;/strong&gt; em constante evolução. Feedbacks e contribuições são sempre bem-vindos!&lt;br&gt;
GitHub: &lt;a href="//github.com/jeffotoni/quick"&gt;Quick&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  golang #webframework #performance #opensource #go #quick
&lt;/h1&gt;

</description>
      <category>backend</category>
      <category>opensource</category>
      <category>performance</category>
      <category>go</category>
    </item>
    <item>
      <title>A Dev's Reflections on AI</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Fri, 29 Aug 2025 18:01:02 +0000</pubDate>
      <link>https://forem.com/jeffotoni/a-devs-reflections-on-ai-1dp1</link>
      <guid>https://forem.com/jeffotoni/a-devs-reflections-on-ai-1dp1</guid>
      <description>&lt;h2&gt;
  
  
  Ethics in Artificial Intelligence?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Let's not fool ourselves, the game has changed&lt;/strong&gt; and I have no doubt about that, so let's reflect a bit on this subject.&lt;/p&gt;

&lt;p&gt;I recently participated in a presentation given by the &lt;strong&gt;LinkedIn News Event&lt;/strong&gt; presented by &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/anacprado/" rel="noopener noreferrer"&gt;Ana Prado&lt;/a&gt;&lt;/strong&gt; and the special guest, the distinguished &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/alvaromachadodias/" rel="noopener noreferrer"&gt;Teacher Dr. Alvaro Machado Dias&lt;/a&gt;"Risks and ethical limits in the use of artificial intelligence"&lt;/strong&gt; . It was very interesting and made me reflect a little more on this &lt;strong&gt;provocative and complex&lt;/strong&gt; issue that often goes unnoticed by those of us who work directly with technology on a daily basis.&lt;/p&gt;

&lt;p&gt;It's curious how certain topics awaken in us that almost uncontrollable urge to think a little beyond, to go deeper, to open the mental "sublime" and start coding ideas as if they were lines of Go code or any other language, of course. That's exactly what happened to me. I could simply follow the routine of a software engineer, systems architect, think about data structures, algorithms, k8s pipelines, but with every conversation I heard, something inside me screamed, you know?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We need to reflect more about this as humanity&lt;/strong&gt; I thought to myself. And here I am, trying to write, not because it was in my daily planning, but because &lt;strong&gt;it's as if I'm compiling philosophical code that insists on running inside me.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;They say I'm an exception, but am I? A technician, an engineer, someone immersed for more than two decades in architecture and programming, but who isn't content with just designing systems. I love when conversation invades the terrain of philosophy, ethics, &lt;strong&gt;those things that have no official documentation, no README on GitHub to guide us&lt;/strong&gt; where to go, what to do, but that need dense and "human" interpretation. I get really annoying when I get into this subject with colleagues.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI in the Gray Territory
&lt;/h2&gt;

&lt;p&gt;And artificial intelligence coming with all its force since the paper "Attention Is All You Need (Vaswani et al., 2017)" published in 2017, which defines the "Transformer" model as a new architecture eliminating the need for RNNs (Recurrent Neural Networks) that were standard in NLP (Natural Language Processing) using the "self-attention" mechanism, exactly, used to capture relationships between words regardless of the distance between them, and this was the watershed moment. Something extraordinary would come from all this soon after, enabling the training of the models we know today: GPT, Claude, Gemini, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;All of this is precisely in this gray territory&lt;/strong&gt; if you understand me. It's technical, mathematical, but at the same time &lt;strong&gt;forces us to ask what it means to be human, what is right or wrong&lt;/strong&gt;, what the actual definition of the word "intelligence" and "knowledge" is, leading us to question and reflect even more on the "definitions of words" and how they are used nowadays.&lt;/p&gt;

&lt;p&gt;I see many always replicating an "absolute concept" as an imposition, treating the word as if it were temporal. In my view, it's much beyond that, &lt;strong&gt;it's timeless, molding itself to each era as something flexible, expandable, continuous and evolutionary&lt;/strong&gt;. The words "intelligence" and "knowledge" were not, and are not understood in an absolute way. It's something much broader. I believe it's present from primitive biological processes to the possibility of manifesting in artificial systems, you know?&lt;/p&gt;

&lt;p&gt;Of course, this is just an opinion. I discovered that I love talking about this. I feel something inside, exactly the same feeling when I'm coding.&lt;/p&gt;

&lt;p&gt;Maybe it sounds strange to some, but &lt;strong&gt;writing about AI ethics gives me the same energy as opening the terminal, importing a package and starting to structure an API in Go&lt;/strong&gt;, yes Go too. The difference is that here the terms are dilemmas, provocations, &lt;strong&gt;questions that stay in goroutines, exactly, waiting for a return&lt;/strong&gt; because we don't have an immediate, absolute defined answer. They need reflection and time to be processed, you know? Like we do in Go when we want to run something asynchronously.&lt;/p&gt;

&lt;p&gt;Everyone talks about ethics when the subject is artificial intelligence. The concern from everyone is clear and evident. "Questions like what about copyrights?", "Who is responsible when an AI system makes an error or causes damage?", "What are the limits of AI?" and so many others we know...&lt;/p&gt;

&lt;p&gt;Ethics is discussed in beautiful reports, in corporate PDFs, in international conferences and even in emerging legislation. Nothing against it, but I prefer to go straight to the point, and the question would be: &lt;strong&gt;are we really talking about ethics? Or are we just trying to organize conflicts of interest that clash all the time?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Myth of Universal Ethics
&lt;/h2&gt;

&lt;p&gt;I believe that &lt;strong&gt;we will never achieve "ethics" itself. Ethics as an absolute value, as universal truth, simply doesn't exist&lt;/strong&gt; in the contemporary world. &lt;strong&gt;What exists are conflicts of ethics&lt;/strong&gt;. On one side we have the ethics of privacy, on the other the ethics of security. On one side the ethics of freedom, on the other the ethics of profit.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is ethical for one culture can be immoral for another&lt;/strong&gt;, what is acceptable for a company can be intolerable for a community. And what we know about AI today &lt;strong&gt;it's not born within a neutral vacuum&lt;/strong&gt;. AI as we know it needs to be fed, trained and controlled by humans and organizations, I say "still." And this is where the debate starts to get much more interesting.&lt;/p&gt;

&lt;h2&gt;
  
  
  Who Really Decides?
&lt;/h2&gt;

&lt;p&gt;Many people think that when we talk about ethics in AI, it's simply about teaching the machine not to do harm. Beautiful, isn't it? But &lt;strong&gt;the real question that should be asked is: who defines what is "harm"?&lt;/strong&gt; Who has the power to determine which values will be embedded in algorithms? Who controls the machine, who profits from it, who loses, who decides what is good? &lt;strong&gt;These four simple questions expose a reality that most avoid facing.&lt;/strong&gt;I understand it's a dense and complex subject, but we have to question ourselves all the time about how we're going to deal with all this.&lt;/p&gt;

&lt;h2&gt;
  
  
  The NYT vs OpenAI Case - A Wake-up Call
&lt;/h2&gt;

&lt;p&gt;A recent example shows the size of the problem. Look, &lt;strong&gt;the New York Times managed to get a court order forcing OpenAI to store all chats, including temporary ones&lt;/strong&gt; (wait, temporary too? can they be stored? Aren't they temporary? Temporary for whom? I was really curious and in doubt), from users. Look at what this means: &lt;strong&gt;a judicial decision can force a global company to change how it handles data from millions of people, without those people having a voice or choice&lt;/strong&gt;. Imagine the dimension of this.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What was temporary becomes permanent&lt;/strong&gt;. Wasn't it private? &lt;strong&gt;And now it becomes potentially accessible.&lt;/strong&gt; Crazy, isn't it? There's a break in trust and vulnerability increases, both for individuals and companies. You can't take sides. I'm not trying to get into the merits here, I'm just demonstrating the fragility that exists and everything is very new and recent, something that came to radically transform what we know.&lt;/p&gt;

&lt;p&gt;And you know what's most serious about all this? &lt;strong&gt;Until now we don't have clear jurisprudence, there's no solid regulatory framework&lt;/strong&gt;, there's not even consensus among countries, imagine at a global level, dealing with situations like this. And this is where I believe &lt;strong&gt;we're stuck in limbo, exactly in a for {}, that is, in an infinite loop&lt;/strong&gt; subject to all kinds of harm, momentary interests of those who have more POWER.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trapped in the Infinite Loop
&lt;/h2&gt;

&lt;p&gt;I have no doubt about the complexity this represents, and if we observe in a global context it's even denser and more complex. &lt;strong&gt;What we see all the time is that interests speak louder than universal principles.&lt;/strong&gt; To facilitate understanding: companies seek profit, governments seek power, communities seek survival. And AI (artificial intelligence), with all its processing capacity and reach, &lt;strong&gt;stays at the center of everything and that's where we see all these interests clashing all the time&lt;/strong&gt; like an old game "Asteroids" - believe me, it's not from my era but I love it. That's why &lt;strong&gt;when we talk about AI ethics without talking about politics, economics and power disputes, you can be sure we're not talking about the "same ethics"&lt;/strong&gt; at all.&lt;/p&gt;

&lt;p&gt;I see many defending codes of conduct and best practices as absolute solutions. I think: is this really possible? &lt;strong&gt;Or is it just a smokescreen, because they're not asking the fundamental questions&lt;/strong&gt; to get straight to the point? Who controls? Who profits? Who is negatively impacted? Who decides what is good? &lt;strong&gt;If we don't have the courage to answer these questions, any conversation about ethics will just be rhetoric.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;And what I notice is that &lt;strong&gt;we're giving up, little by little, our autonomy. Literally handing over our data in exchange for "convenience."&lt;/strong&gt; I'm also part of all this, I'm also trapped and hostage to everything, but that doesn't mean we can't reflect and discuss everything that's happening. We've trusted platforms without knowing how the rules actually work. I notice that &lt;strong&gt;we're allowing them to define the limits of technology in our place&lt;/strong&gt;. I feel like &lt;strong&gt;we're outsourcing our own responsibility&lt;/strong&gt; and somewhere far away, well hidden, far away, someone will be taking care of ethics for us. But are they really?&lt;/p&gt;

&lt;p&gt;And the reflection always remains: &lt;strong&gt;AI ethics is not a corporate guide, not a checklist of good intentions but a beautiful and enormous battlefield&lt;/strong&gt; like the game "CALL OF DUTY." &lt;strong&gt;Where values confront each other, where interests impose themselves and where human beings need to make complex decisions&lt;/strong&gt; about who will be or continue being the protagonist, you know?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;We shouldn't pretend anymore that AI ethics is just a beautiful chapter in corporate reports&lt;/strong&gt;, but rather about who will decide the future of our relationship with technology: us or them?&lt;/p&gt;

&lt;p&gt;As a good user and developer, of course, &lt;strong&gt;we know that every code has a gigantic possibility of having some kind of bug&lt;/strong&gt;, especially code generated by AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The question here is: are we going to continue debugging our humanity in production or are we finally going to take control of our own ethical code?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What do you think? Are we being protagonists or just users of a system we don't fully understand?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you made it this far, I thank you from the heart and thank you very much for this joint reflection. &lt;strong&gt;Share your views in the comments and let's build this debate together, line by line, like good collaborative code.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Hope you enjoy it! 🚀🚀 ☺️&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Reflexões de um Dev sobre IA</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Fri, 29 Aug 2025 18:00:24 +0000</pubDate>
      <link>https://forem.com/jeffotoni/etica-em-inteligencia-artificial--5agl</link>
      <guid>https://forem.com/jeffotoni/etica-em-inteligencia-artificial--5agl</guid>
      <description>&lt;h1&gt;
  
  
  Ética em Inteligência Artificial ?
&lt;/h1&gt;

&lt;p&gt;Participei recentemente de um apresentação feita pelo &lt;strong&gt;Evento da LinkedIn Notícias&lt;/strong&gt; apresentado pela &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/anacprado/" rel="noopener noreferrer"&gt;Ana Prado&lt;/a&gt;&lt;/strong&gt; e o convidado especial o ilustre &lt;strong&gt;&lt;a href="https://www.linkedin.com/in/alvaromachadodias/" rel="noopener noreferrer"&gt;Professor Dr. Alvaro Machado Dias&lt;/a&gt; "Riscos e limites éticos no uso da inteligência artificial",&lt;/strong&gt; bem interessante e que me fez refletir um pouco mais sobre essa questão tão &lt;strong&gt;provocativa e complexa&lt;/strong&gt; e que muitas vezes passa despercebido por nós que está trabalhando no dia a dia diretamente com a tecnologia.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não devemos nos iludir, o jogo é outro&lt;/strong&gt; e isso não tenho dúvidas, então vamos refletir um pouco sobre o assunto.&lt;/p&gt;

&lt;p&gt;É curioso como certos temas despertam em nós aquela vontade quase incontrolável de pensar um pouco além, de ir mais fundo, de abrir o sublime mental e começar a &lt;strong&gt;godar ideias&lt;/strong&gt; como se fossem &lt;strong&gt;linhas de código em Go&lt;/strong&gt; ou qualquer outra lang é claro. Foi exatamente o que aconteceu comigo. Eu poderia simplesmente seguir a rotina de engenheiro de software, arquiteto de sistemas, pensar em estruturas de dados, em algoritmos, em pipelines k8s, mas a cada fala que eu ouvia, algo dentro de mim gritava, entende?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Precisamos refletir mais sobre isso como humanidade&lt;/strong&gt; pensei comigo. E aqui estou, tentando escrever, não porque estava no meu planejamento do dia a dia, mas porque &lt;strong&gt;é como se estivesse compilando um código filosófico que insiste em rodar dentro de mim.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Dizem que sou uma exceção, mas será? Um técnico, um engenheiro, alguém mergulhado há mais de duas décadas em arquitetura e programação, mas que não se contenta em apenas projetar sistemas. Eu amo quando a conversa invade o terreno da filosofia, da ética, daquilo que &lt;strong&gt;não tem documentação oficial, não existe no github um README para nos orientar&lt;/strong&gt; para onde ir, o que fazer, mas que precisa de interpretação densa e "humana", fico muito chato quando entro nesse assunto com os colegas.&lt;/p&gt;

&lt;h3&gt;
  
  
  A AI no Território Cinzento
&lt;/h3&gt;

&lt;p&gt;E a inteligência artificial vindo com toda sua força desde do paper  &lt;strong&gt;"&lt;a href="https://proceedings.neurips.cc/paper_files/paper/2017/file/3f5ee243547dee91fbd053c1c4a845aa-Paper.pdf" rel="noopener noreferrer"&gt;Attention Is All You Need&lt;/a&gt;&lt;/strong&gt; (Vaswani et al., 2017)" publicado em 2017, que define o modelo "&lt;strong&gt;Transformer&lt;/strong&gt;" como uma nova arquitetura eliminando a necessidade de &lt;strong&gt;RNNs&lt;/strong&gt; (Recurrent Neural Networks) redes recorrentes que era padrão em &lt;strong&gt;NLP&lt;/strong&gt; (Natural Language Processing) usando mecanismo de atenção "self-attention" isso mesmo usado para capturar relações entre palavras independente da distância entre elas, e isso foi o divisor de águas algo extraordinário viria de tudo isso logo depois permitindo o treinamento dos modelos que conhecemos hoje &lt;strong&gt;GPT, Claude, Gemini&lt;/strong&gt;, etc.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tudo isso está justamente nesse território cinzento&lt;/strong&gt; se é que me entende, ela é técnica, matemática, mas ao mesmo tempo &lt;strong&gt;nos obriga a perguntar o que é ser humano, o que é certo ou errado&lt;/strong&gt;, qual é a definição de fato da palavra "&lt;strong&gt;inteligência&lt;/strong&gt;" e "&lt;strong&gt;conhecimento&lt;/strong&gt;" nos levando a questionar a refletir ainda mais sobre as "&lt;strong&gt;definições das palavras&lt;/strong&gt;" e como ela é utilizada nos dias atuais.&lt;/p&gt;

&lt;p&gt;Vejo muitos replicando sempre um "&lt;strong&gt;conceito absoluto&lt;/strong&gt;" como uma imposição, tratando como se a palavra fosse temporal, ao meu ver é muito além disso, &lt;strong&gt;é atemporal se moldando a cada época como algo flexível, expansível, contínuo e evolutivo&lt;/strong&gt; a palavra "inteligência" e "conhecimento" não foi, e nem é entendida de forma absoluta, é algo bem mais amplo, eu acredito que está presente desde dos processos biológicos primitivos até a possibilidade de se manifestar em sistemas artificiais entende ?&lt;/p&gt;

&lt;p&gt;Claro que é somente uma opinião. Descobri que adoro falar sobre isso, eu sinto algo por dentro exatamente o mesmo sentimento quando estou &lt;strong&gt;godando&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Talvez soe estranho para alguns, mas &lt;strong&gt;escrever sobre ética em IA me dá a mesma energia que abrir o terminal, importar um pacote e começar a estruturar uma API em Go&lt;/strong&gt;, sim Go também. A diferença é que aqui os termos são dilemas, provocações, &lt;strong&gt;perguntas que ficam em goroutines, isso mesmo ficam aguardando o retorno&lt;/strong&gt; por que não temos uma resposta imediata definida absoluta. Precisam de reflexão e de tempo para serem processadas, entende ? Como fazemos em Go quando queremos rodar algo de forma assíncrona.&lt;/p&gt;

&lt;p&gt;Todo mundo fala em ética quando o assunto é inteligência artificial é claro e nítido a preocupação de todos. "Perguntas como e os direitos autorais?", "Quem é responsável quando um sistema de IA comete um erro ou dano?", "Qual o limite da IA?" e tantas outras que conhecemos…&lt;/p&gt;

&lt;p&gt;Fala-se em ética nos relatórios bonitos, nos PDFs corporativos, nos congressos internacionais e até nas legislações que estão nascendo, nada contra, porém eu prefiro irmos direto ao ponto, e a pergunta seria &lt;strong&gt;que estamos realmente falando de ética? Ou será que estamos apenas tentando organizar conflitos de interesses que se chocam o tempo todo?&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O Mito da Ética Universal
&lt;/h3&gt;

&lt;p&gt;Eu acredito que &lt;strong&gt;nunca vamos alcançar "a ética" em si. Ética como valor absoluto, como verdade universal, simplesmente não existe&lt;/strong&gt; no mundo contemporâneo.&lt;strong&gt;O que existe são conflitos de ética&lt;/strong&gt;. De um lado temos a ética da privacidade, de outro a ética da segurança. De um lado a ética da liberdade, de outro a ética do lucro.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é ético para uma cultura pode ser imoral para outra&lt;/strong&gt;, o que é aceitável para uma empresa pode ser intolerável para uma comunidade. E o que conhecemos de AI hoje &lt;strong&gt;ela não nasce dentro de um vácuo neutro&lt;/strong&gt;. A AI como conhecemos precisa ser alimentada, treinada e controlada por humanos e organizações, eu digo "ainda". E é aqui que o debate começa a ficar bem mais interessante.&lt;/p&gt;

&lt;h3&gt;
  
  
  Quem Realmente Decide?
&lt;/h3&gt;

&lt;p&gt;Muitas pessoas pensam que, ao falarmos de ética na AI, trata simplesmente de ensinar a máquina a não fazer mal. Lindo isso não é ? Mas &lt;strong&gt;a pergunta real deveria ser feita é, quem define o que é "mal"?&lt;/strong&gt; Quem tem o poder de determinar quais valores serão embutidos nos algoritmos? Quem controla a máquina, quem lucra com ela, quem perde é quem decide o que é bom? &lt;strong&gt;Essas quatro perguntas simples escancaram uma realidade que a maioria evita enfrentar&lt;/strong&gt;. Entendo que é um assunto denso e complexo, mas temos que nos questionar todo o tempo como vamos lidar com tudo isso.&lt;/p&gt;

&lt;h3&gt;
  
  
  O Caso NYT vs OpenAI - Um Wake-up Call
&lt;/h3&gt;

&lt;p&gt;Um exemplo recente mostra o tamanho do problema, olhem só &lt;strong&gt;o New York Times conseguiu na Justiça que a OpenAI guarde todos os chats, inclusive os temporários&lt;/strong&gt; (ops temporários também? eles podem ser armazenados? Não são temporários ? Temporários para quem ? Fiquei realmente curioso e na dúvida), dos usuários. Olha o que isso significa, &lt;strong&gt;uma decisão judicial pode obrigar uma empresa global a alterar a forma como lida com dados de milhões de pessoas, sem que essas pessoas tenham voz ou escolha&lt;/strong&gt;, imagina a dimensão disso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que era temporário, passa a ser permanente&lt;/strong&gt;. Não era privado ? E &lt;strong&gt;agora passa a ser potencialmente acessível&lt;/strong&gt;. Loucura não é ? Existe uma quebra na confiança e a vulnerabilidade aumenta, tanto para indivíduos quanto para empresas. Não dá para assumir lados, não estou querendo aqui entrar no mérito, estou só demonstrando a fragilidade que existe e tudo é muito novo e recente algo que veio para transformar radicalmente o que conhecemos.&lt;/p&gt;

&lt;p&gt;E sabem o que é mais grave disso tudo &lt;strong&gt;até o momento não temos uma jurisprudência clara, não existe um marco regulatório sólido&lt;/strong&gt;, não existe nem um consenso nos países imagina a nível global tratando de situações como esta. E é aqui que acredito que &lt;strong&gt;ficamos em um limbo isso mesmo em um for {} , ou seja em um loop infinito&lt;/strong&gt; sujeitos a todo tipo de mazelas, interesses momentâneos de quem tem mais PODER.&lt;/p&gt;

&lt;h3&gt;
  
  
  Presos no Loop Infinito
&lt;/h3&gt;

&lt;p&gt;Não tenho dúvidas da complexidade que representa tudo isso, e se observamos em um contexto global é ainda mais denso e complexo. &lt;strong&gt;O que vemos todo o tempo é que os interesses falam mais alto do que princípios universais&lt;/strong&gt;. Para facilitar o entendimento temos. As empresas buscam lucro, governos buscam poder, comunidades buscam sobrevivência. E a AI (inteligência artificial), com toda sua capacidade de processamento e alcance, &lt;strong&gt;fica no centro de tudo e aí que vemos todos esses interesses se chocando todo o tempo&lt;/strong&gt; como um game antigo "Asteroids" acreditem não é da minha época mas curto muito. É por isso que &lt;strong&gt;quando falamos de ética em AI sem falarmos de política, de economia e disputas de poder pode ter certeza que não estamos falando da "mesma ética"&lt;/strong&gt; não mesmo.&lt;/p&gt;

&lt;p&gt;Vejo muitos defendendo códigos de conduta e boas práticas como solução absoluta, eu penso que será mesmo possível ? &lt;strong&gt;Ou é somente uma cortina de fumaça, por que não estão fazendo as perguntas fundamentais&lt;/strong&gt; para irmos direto ao ponto ? &lt;strong&gt;Quem controla? Quem lucra? Quem é impactado negativamente? Quem decide o que é bom? Se não tivermos coragem de responder a essas questões, qualquer conversa sobre ética será só retórica.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;E o que percebo é que &lt;strong&gt;estamos abrindo mão, pouco a pouco, da nossa autonomia. Literalmente entregando nossos dados em troca de "conveniência".&lt;/strong&gt; Eu também faço parte de tudo isso, eu também estou preso e refém de tudo, mas não quer dizer que não podemos refletir e discutir sobre tudo que está ocorrendo. Temos confiado em plataformas sem saber como de fato funcionam as regras. Percebo que &lt;strong&gt;estamos permitindo que eles definem os limites da tecnologia em nosso lugar&lt;/strong&gt;, eu sinto que estou &lt;strong&gt;terceirizando nossa própria responsabilidade&lt;/strong&gt; e em algum lugar bem distante, bem oculto bem longe estará cuidando da ética para nós. Mas será que está?&lt;/p&gt;

&lt;p&gt;E fica sempre a reflexão &lt;strong&gt;ética em inteligência artificial não é um guia corporativo, não é um checklist de boas intenções&lt;/strong&gt; e sim &lt;strong&gt;um belo e enorme campo de batalha&lt;/strong&gt; como o game "&lt;strong&gt;&lt;a href="https://www.callofduty.com/br/pt" rel="noopener noreferrer"&gt;CALL OF DUTY&lt;/a&gt;&lt;/strong&gt;". &lt;strong&gt;Onde os valores se confrontam, onde interesses se impõem e onde o ser humano precisa tomar decisões complexas&lt;/strong&gt; como quem será ou continuará sendo protagonista, entende ?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não deveríamos mais fingir que ética em IA é só um capítulo bonito em relatórios corporativos&lt;/strong&gt;, mas sim de quem vai decidir o futuro da nossa relação com a tecnologia, ou seja, nós ou eles?&lt;/p&gt;

&lt;p&gt;Como um bom usuário e desenvolvedor claro, &lt;strong&gt;sabemos que todo código existe uma possibilidade gigantesca em possuir algum tipo de bug&lt;/strong&gt;, principalmente códigos gerados por AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A questão aqui é, vamos continuar debugando nossa humanidade em produção ou finalmente vamos assumir o controle do nosso próprio código ético?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;E vocês, o que pensam? Estamos sendo protagonistas ou apenas users de um sistema que não compreendemos totalmente?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se chegaram até aqui, agradeço de coração e muito obrigado pela reflexão conjunta. &lt;strong&gt;Compartilhem suas visões nos comentários e vamos construir esse debate juntos, linha por linha, como um bom código colaborativo&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Espero que gostem 🚀🚀 ☺️&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Cache em Memória usando Go ❤️</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Fri, 22 Aug 2025 19:41:24 +0000</pubDate>
      <link>https://forem.com/jeffotoni/cache-em-memoria-usando-go-4ie4</link>
      <guid>https://forem.com/jeffotoni/cache-em-memoria-usando-go-4ie4</guid>
      <description>&lt;p&gt;Se tem uma coisa que sempre me salva no dia a dia, é &lt;strong&gt;cache em memória&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Quando a &lt;strong&gt;latência&lt;/strong&gt; aperta e a &lt;strong&gt;performance&lt;/strong&gt; precisa voar, um bom cache faz toda a diferença!&lt;/p&gt;

&lt;p&gt;Ao longo do tempo, tive a oportunidade de testar várias implementações: go-cache, FreeCache, Ristretto, FastCache… e o mais legal do &lt;strong&gt;Go&lt;/strong&gt; é que a inovação não para, sempre surgem novas opções!&lt;/p&gt;

&lt;p&gt;Então, bateu aquela &lt;strong&gt;curiosidade&lt;/strong&gt; e um pouco de &lt;strong&gt;desafio&lt;/strong&gt; claro 😁, e para deixar tudo ainda mais empolgante, &lt;strong&gt;voltei a colaborar no projeto open source do  &lt;a href="https://github.com/jeffotoni/quick" rel="noopener noreferrer"&gt;Quick&lt;/a&gt;!&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;p&gt;O  &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/quick" rel="noopener noreferrer"&gt;Quick&lt;/a&gt;&lt;/strong&gt;, é um roteador leve feito em Go, que está evoluindo para se tornar um framework web completo! 💡🔥&lt;/p&gt;

&lt;p&gt;E fiquem ligados… &lt;strong&gt;em breve trago mais novidades sobre ele! 😍&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Quick&lt;/strong&gt; está precisando de um &lt;strong&gt;middleware de cache, isso mesmo acreditem 🤣&lt;/strong&gt;, e um dos seus pilares é &lt;strong&gt;não ter dependências externas&lt;/strong&gt;, mantendo sua abordagem &lt;strong&gt;minimalista&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Juntando tudo isso, eu &lt;strong&gt;não aguentei&lt;/strong&gt;… e quem me conhece &lt;strong&gt;sabe bem como eu sou 🤣🤣&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Resolvi &lt;strong&gt;reviver o que havia feito há um ano&lt;/strong&gt;, testar novas ideias e evoluir o &lt;strong&gt;gcache para gocache&lt;/strong&gt;. Já faz um tempo que venho &lt;strong&gt;brincando nas madrugadas&lt;/strong&gt; com alguns &lt;strong&gt;algoritmos de cache&lt;/strong&gt; e até gravei um vídeo sobre isso, acredita ? De tão gostoso é brincar com esta estrutura de dados.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Quer ver na prática?&lt;/strong&gt; Confere aqui =&amp;gt; &lt;a href="https://www.youtube.com/watch?v=0QzFMSdCwyM" rel="noopener noreferrer"&gt;gcache no YouTube&lt;/a&gt; 🎥&lt;/p&gt;

&lt;p&gt;O resultado do que fiz ? Tá tudo no post abaixo! 👇 Espero que gostem 🚀😃.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Cache em Memória ?
&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;cache em memória&lt;/strong&gt; é uma técnica essencial para otimização de desempenho em sistemas computacionais. Ele consiste no &lt;strong&gt;armazenamento temporário de dados diretamente na RAM&lt;/strong&gt;, reduzindo a necessidade de acessos repetidos a fontes mais lentas, como bancos de dados ou sistemas de arquivos.&lt;/p&gt;

&lt;p&gt;Ao manter os dados mais acessados na memória, eliminamos o &lt;strong&gt;gargalo de I/O (entrada e saída)&lt;/strong&gt;, permitindo respostas extremamente rápidas e um uso mais eficiente dos recursos computacionais. Lindo, não é? Para alcançar essa eficiência, é essencial utilizar linguagens de programação que ofereçam um gerenciamento robusto e controle eficiente sobre esses processos.&lt;/p&gt;

&lt;p&gt;A linguagem que escolhi, &lt;strong&gt;alguém tem dúvidas ? Claro, foi o &lt;a href="https://go.dev/" rel="noopener noreferrer"&gt;Go&lt;/a&gt;. ❤️&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Embora o &lt;strong&gt;Go&lt;/strong&gt; não seja uma linguagem de gerenciamento manual de memória como &lt;strong&gt;C ou Rust&lt;/strong&gt;, ele ainda oferece um equilíbrio poderoso entre &lt;strong&gt;simplicidade, eficiência e controle de recursos.&lt;/strong&gt; Mesmo contando com um &lt;a href="https://tip.golang.org/doc/gc-guidehttps://tip.golang.org/doc/gc-guide" rel="noopener noreferrer"&gt;Garbage Collector (GC)&lt;/a&gt;, sua baixa latência e otimizações constantes permitem a criação de &lt;strong&gt;sistemas de cache em memória altamente performáticos&lt;/strong&gt;, e vamos ver isso logo abaixo na prática.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt; se destaca por seu &lt;strong&gt;modelo de concorrência eficiente&lt;/strong&gt;, utilizando &lt;strong&gt;goroutines e &lt;a href="https://go.dev/tour/concurrency/9" rel="noopener noreferrer"&gt;sync.Mutex&lt;/a&gt; / RWMutex&lt;/strong&gt; para garantir acesso rápido e seguro ao cache, minimizando contenção e maximizando a escalabilidade.&lt;/p&gt;

&lt;p&gt;Seu &lt;strong&gt;runtime altamente otimizado&lt;/strong&gt;, aliado à capacidade de gerar &lt;strong&gt;binários leves e de alta performance&lt;/strong&gt;, faz dele uma escolha excepcional para aplicações que exigem &lt;strong&gt;respostas rápidas, baixo consumo de CPU e um uso eficiente da RAM.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Quer saber mais sobre esse tópico ?
&lt;/h3&gt;

&lt;p&gt;Escrevi alguns artigos sobre o assunto, e se você curte &lt;strong&gt;desempenho e concorrência em Go&lt;/strong&gt;, recomendo dar uma olhada nesses dois:&lt;/p&gt;

&lt;p&gt;📌 &lt;a href="https://dev.to/jeffotoni/um-pouco-sobre-goroutines-em-go-3lbk"&gt;“Um pouco sobre Goroutines”&lt;/a&gt; → Explorando a magia das goroutines e como elas ajudam a escalar aplicações com eficiência.&lt;/p&gt;

&lt;p&gt;📌 &lt;a href="https://dev.to/jeffotoni/workloads-em-go-59ab"&gt;“Workloads: CPU-Bound e IO-Bound”&lt;/a&gt; → Um guia essencial para entender e otimizar cargas de trabalho no Go.&lt;/p&gt;

&lt;p&gt;Espero que gostem! 😌🤗&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Go&lt;/strong&gt; é a ferramenta fantástica, e para construirmos &lt;strong&gt;soluções robustas e simples ❤️.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  O que é gocache ?
&lt;/h3&gt;

&lt;p&gt;O &lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt; é um &lt;strong&gt;cache de memória fragmentada de alto desempenho&lt;/strong&gt; para aplicativos Go, projetado para &lt;strong&gt;velocidade e eficiência&lt;/strong&gt;. Ele foi otimizado para &lt;strong&gt;operações simultâneas de leitura e gravação,&lt;/strong&gt; aproveitando &lt;strong&gt;fragmentação inteligente, otimizações de bloqueio (mutex) e gerenciamento eficiente de expiração&lt;/strong&gt; para superar outras soluções de cache baseadas em Go.&lt;/p&gt;

&lt;p&gt;A implementação do  &lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt; é &lt;strong&gt;uma evolução do gcache&lt;/strong&gt;, que comecei há &lt;strong&gt;um ano&lt;/strong&gt;, inicialmente como um projeto &lt;strong&gt;didático e acadêmico&lt;/strong&gt;. Desde então, fiz diversas &lt;strong&gt;versões diferentes de forma didática&lt;/strong&gt;, refinando a arquitetura até chegar no &lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt; 😍.&lt;/p&gt;

&lt;p&gt;Dentre as versões existe uma feita toda com &lt;strong&gt;Generics&lt;/strong&gt; antes que me perguntem 🤗 e foi criado um outro repo chamado &lt;a href="https://github.com/jeffotoni/benchmark-gocache" rel="noopener noreferrer"&gt;Benchmarking gocache&lt;/a&gt; é aqui que encontraram todas versões disponíveis e os tests que fiz até chegar em nossa &lt;strong&gt;V9&lt;/strong&gt; &lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt; , isso mesmo a versão que estamos usando hoje é a &lt;strong&gt;v9&lt;/strong&gt; 🤗.&lt;/p&gt;

&lt;p&gt;Um dos seus pilares é ser &lt;strong&gt;100% minimalista&lt;/strong&gt; e livre de &lt;strong&gt;dependências externas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;gocache&lt;/strong&gt; é uma &lt;a href="https://pkg.go.dev/github.com/jeffotoni/gocache#section-documentation" rel="noopener noreferrer"&gt;biblioteca em Go&lt;/a&gt;, não um serviço como Redis!&lt;/p&gt;

&lt;p&gt;Embora tanto o &lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt; quanto o &lt;em&gt;Redis&lt;/em&gt; armazenem dados em memória, &lt;strong&gt;eles têm propósitos diferentes&lt;/strong&gt;:&lt;/p&gt;

&lt;p&gt;:&lt;/p&gt;

&lt;p&gt;📌 &lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt; &lt;strong&gt;é uma LIB escrita em Go&lt;/strong&gt;, projetada para ser embutida diretamente no seu código &lt;strong&gt;Go&lt;/strong&gt;, funcionando como um cache &lt;strong&gt;local&lt;/strong&gt; dentro da aplicação.&lt;/p&gt;

&lt;p&gt;📌 &lt;strong&gt;Redis é um serviço externo&lt;/strong&gt; que roda como um banco de dados em memória independente, permitindo &lt;strong&gt;cache distribuído&lt;/strong&gt; e comunicação entre múltiplas instâncias.&lt;/p&gt;

&lt;p&gt;Se você precisa de &lt;strong&gt;um cache ultrarrápido diretamente na sua aplicação Go, sem necessidade de conexões externas ou infraestrutura adicional,&lt;/strong&gt; o &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt;&lt;/strong&gt; é a solução ideal! 🚀&lt;/p&gt;

&lt;p&gt;Caso necessite de uma &lt;strong&gt;cache distribuído e compartilhado entre múltiplas aplicações, Redis&lt;/strong&gt; pode ser uma melhor escolha.&lt;/p&gt;

&lt;p&gt;Quer contribuir, sugerir melhorias ou compartilhar novas ideias? Fique à vontade! 🚀 Aprender e evoluir faz parte do processo, e vou adorar discutir otimizações e novas possibilidades! 😃&lt;/p&gt;

&lt;p&gt;Podem enviar aqui &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache/issues" rel="noopener noreferrer"&gt;issues gocache&lt;/a&gt;&lt;/strong&gt; 🤗.&lt;/p&gt;

&lt;h3&gt;
  
  
  gocache vs. go-cache vs. freecache
&lt;/h3&gt;

&lt;p&gt;Para validar o desempenho do &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt;&lt;/strong&gt;, realizamos &lt;strong&gt;benchmarks comparativos&lt;/strong&gt; contra duas das bibliotecas de cache em memória mais conhecidas no &lt;strong&gt;ecossistema Go&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;go-cache&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Amplamente utilizado, fornece um cache baseado em mapa com controle de expiração.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;freecache&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um cache baseado em segmentos de memória, eficiente para workloads de alta concorrência.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cenário de Teste&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Os &lt;strong&gt;benchmarks&lt;/strong&gt; foram executados simulando um ambiente de alta demanda, onde diversas operações de &lt;strong&gt;SET&lt;/strong&gt; e &lt;strong&gt;GET&lt;/strong&gt; são realizadas de forma concorrente. &lt;/p&gt;

&lt;p&gt;O objetivo era avaliar &lt;strong&gt;a eficiência da escrita (SET)&lt;/strong&gt; a quantidade de operações por segundo e tempo médio de execução. &lt;strong&gt;A eficiência da leitura (GET)&lt;/strong&gt; e o tempo médio de recuperação dos dados. &lt;strong&gt;O impacto da concorrência&lt;/strong&gt; como o cache responde sob alta carga.&lt;/p&gt;

&lt;h3&gt;
  
  
  Benchmark
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Resultados dos Benchmarks (3 segundos de execução)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;LIBS. SET Ops SET ns/op GET Ops  GET ns/op Observações&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt; 24,317,970&lt;/strong&gt;  248.9 ns/op &lt;strong&gt;14,749,851&lt;/strong&gt; 270.8 ns/op 🏆 Very fast write, good read&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;go-cache&lt;/strong&gt; 16,311,879 389.9 ns/op 13,021,398 277.5 ns/op 🚀 Excellent reads, slow writes&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;freecache&lt;/strong&gt; 23,577,146 293.9 ns/op 8,554,900 395.8 ns/op ❌ Decent write, slow read&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt;&lt;/strong&gt; foi a implementação &lt;strong&gt;mais rápida em escrita (SET)&lt;/strong&gt;, conseguindo &lt;strong&gt;24,3M de operações em 3s&lt;/strong&gt; com um tempo médio de &lt;strong&gt;248.9 ns/op&lt;/strong&gt;, superando &lt;strong&gt;go-cache (389.9 ns/op)&lt;/strong&gt; e &lt;strong&gt;FreeCache (293.9 ns/op)&lt;/strong&gt;. Esse desempenho demonstra a &lt;strong&gt;eficiência da estratégia de shards e mutexes bem otimizados&lt;/strong&gt;, minimizando contenção e garantindo operações mais rápidas.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;go-cache&lt;/strong&gt; teve um desempenho razoável na leitura, processando &lt;strong&gt;13M de GETs em 3s&lt;/strong&gt; com um tempo médio de &lt;strong&gt;277.5 ns/op&lt;/strong&gt;. Apesar de ser significativamente &lt;strong&gt;mais lento na escrita&lt;/strong&gt;, seu modelo baseado em &lt;strong&gt;mapas de memória com RWMutex&lt;/strong&gt; ajuda a reduzir o overhead em workloads voltadas para leitura de dados.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;FreeCache apresentou o pior tempo de leitura&lt;/strong&gt;, com um GET médio de &lt;strong&gt;395.8 ns/op&lt;/strong&gt;, tornando-o menos eficiente para cargas de trabalho intensivas em leituras. Apesar de ser competitivo na escrita &lt;strong&gt;(23,5M de SETs em 3s)&lt;/strong&gt;, sua abordagem baseada em &lt;strong&gt;segmentação de memória&lt;/strong&gt; pode resultar em &lt;strong&gt;fragmentação e maior overhead ao recuperar os dados armazenados.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt;&lt;/strong&gt; &lt;strong&gt;demonstrou ser a melhor escolha para cenários onde a velocidade de escrita é crítica&lt;/strong&gt;, sendo cerca de &lt;strong&gt;36% mais rápido que o go-cache e 18% mais rápido que o FreeCache&lt;/strong&gt; em operações de SET. Além disso, o &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt; manteve uma boa performance em GETs&lt;/strong&gt;, tornando-se uma solução &lt;strong&gt;balanceada e eficiente&lt;/strong&gt; para aplicações de cache em memória. 🚀&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Todos os testes detalhados podem ser encontrados no repositório:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://github.com/jeffotoni/benchmark-gocache" rel="noopener noreferrer"&gt;Benchmark completo no GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftglo3wuna0y5wov15rsc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftglo3wuna0y5wov15rsc.png" alt="benchmark" width="800" height="638"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;gocache X go-cache X freecache&lt;/p&gt;

&lt;h3&gt;
  
  
  Exemplo
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Para utilizar o gocache, basta fazer a chamada direto do seu code Go&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;$ go mod init myprojet&lt;/p&gt;

&lt;p&gt;$ go mod tidy&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74g5sdtqwp2eyxqi3pbj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F74g5sdtqwp2eyxqi3pbj.png" alt="call gocache" width="800" height="469"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;📌 Para acessar basta entrar aqui &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt;&lt;/strong&gt; 🚀&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt;&lt;/strong&gt; utiliza uma estratégia baseada em &lt;strong&gt;shards&lt;/strong&gt; e um &lt;strong&gt;ring buffer&lt;/strong&gt; para garantir alto desempenho e evitar &lt;strong&gt;contenção excessiva de locks.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favw5zq3pt60r5tru26oh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Favw5zq3pt60r5tru26oh.png" alt="Estrutura dados gocache" width="800" height="203"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;estrutura dados gocache&lt;/p&gt;

&lt;p&gt;Cada &lt;strong&gt;shard&lt;/strong&gt; é uma partição independente do cache, possuindo sua própria estrutura de sincronização (&lt;strong&gt;RWMutex&lt;/strong&gt;) e um &lt;strong&gt;ring buffer&lt;/strong&gt; para rastrear a expiração dos itens. O &lt;strong&gt;ring buffer&lt;/strong&gt; permite um gerenciamento eficiente de itens expirados sem precisar percorrer todo o cache.&lt;/p&gt;

&lt;h3&gt;
  
  
  Algoritmos de Hash Mais Usados em Cache em Memória
&lt;/h3&gt;

&lt;p&gt;Os algoritmos de &lt;strong&gt;hash&lt;/strong&gt; desempenham um papel essencial no desempenho de &lt;strong&gt;caches em memória&lt;/strong&gt;, sendo responsáveis por transformar chaves em identificadores únicos para recuperação eficiente de dados. Escolher o algoritmo certo pode influenciar diretamente a &lt;strong&gt;velocidade das operações de SET e GET, consumo de memória e concorrência&lt;/strong&gt;.&lt;/p&gt;




&lt;p&gt;&lt;strong&gt;📊 Comparação de Algoritmos de Hash&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;🧮 Algoritmo | ✅ Melhor Para | 🚀 Ponto Forte &lt;/p&gt;




&lt;p&gt;🔹 FNV-1a | 🔑 Chaves curtas (≤10 caracteres) | ⚡ Baixo overhead e simplicidade &lt;/p&gt;

&lt;p&gt;🔹 xxHash | 🏗️ Chaves longas (&amp;gt;10 caracteres) | ⚡ Rápido e eficiente strings longas &lt;/p&gt;

&lt;p&gt;🔹 MurmurHash3 | 🎲 Estruturas de dados probabilis. | 🎯 Boa dispersão e baixa colisão&lt;/p&gt;

&lt;p&gt;🔹 CityHash | 📚 Indexação de grandes volumes | 🏎️ Ótimo para CPUs modernas &lt;/p&gt;

&lt;p&gt;🔹 MetroHash | 🌐 Telecom e redes | 📡 Alto desempenho tráfego massivo &lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;FNV-1a&lt;/strong&gt; é uma variante do algoritmo &lt;strong&gt;Fowler-Noll-Vo&lt;/strong&gt;, projetado para ser &lt;strong&gt;rápido e eficiente&lt;/strong&gt; em CPUs modernas. Ele opera aplicando &lt;strong&gt;XOR&lt;/strong&gt; e &lt;strong&gt;multiplicações&lt;/strong&gt; para espalhar os bits da chave de forma uniforme.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0fvoki7u777dkkicrev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fo0fvoki7u777dkkicrev.png" alt="FNV-1a" width="800" height="172"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;fnv1aHash utilizado no gocache&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;xxHash&lt;/strong&gt; é um algoritmo altamente otimizado que processa dados em &lt;strong&gt;blocos de 4 ou 8 bytes&lt;/strong&gt;, reduzindo significativamente a latência para chaves longas. Ele usa &lt;strong&gt;operações bitwise e multiplicações&lt;/strong&gt; otimizadas para arquitetura moderna de CPU.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfbgh9awfwa7hl4xn2tp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvfbgh9awfwa7hl4xn2tp.png" alt="xxHash64" width="800" height="109"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;xxHash64&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;MurmurHash3&lt;/strong&gt; usa um esquema de &lt;strong&gt;mistura de bits&lt;/strong&gt; para produzir distribuições uniformes de hashes, minimizando colisões. Ele é altamente eficiente em &lt;strong&gt;estruturas como bloom filters e tabelas hash&lt;/strong&gt; distribuídas.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;CityHash&lt;/strong&gt;, desenvolvido pelo Google, é otimizado para &lt;strong&gt;arquiteturas x86 e ARM modernas&lt;/strong&gt;, utilizando &lt;strong&gt;instruções vetorizadas (SSE e AVX)&lt;/strong&gt; para aumentar a velocidade. Ele é altamente eficiente para &lt;strong&gt;grandes volumes de dados&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;MetroHash&lt;/strong&gt; é um hash projetado para &lt;strong&gt;alta velocidade e baixa latência&lt;/strong&gt;, sendo usado em redes de telecomunicações e aplicações que requerem alto throughput. Ele é baseado em técnicas de &lt;strong&gt;processamento paralelo&lt;/strong&gt; para maximizar a performance&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;O uso de cache em memória é uma estratégia essencial para aplicações de alto desempenho. O &lt;strong&gt;gocache&lt;/strong&gt; implementa um sistema eficiente baseado em &lt;strong&gt;shards, mutexes e um ring buffer para expiração de itens&lt;/strong&gt;, garantindo &lt;strong&gt;baixo overhead&lt;/strong&gt;. Durante os testes, analisamos diferentes técnicas de &lt;strong&gt;hashing&lt;/strong&gt; e validamos a melhor abordagem para manter um desempenho consistente.&lt;/p&gt;

&lt;p&gt;Ainda sigo observando e testando mais possibilidades a medida que vou estudando e aprendendo, recebo muitos comentários e sugestões, e vou testando e subindo em um repo de benchmarking que pode se encontrado aqui &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/benchmark-gocache" rel="noopener noreferrer"&gt;Benchmark gocache&lt;/a&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Se você trabalha com &lt;strong&gt;Go&lt;/strong&gt; e precisa de um &lt;strong&gt;cache de alto desempenho&lt;/strong&gt;, experimente o &lt;strong&gt;&lt;a href="https://github.com/jeffotoni/gocache" rel="noopener noreferrer"&gt;gocache&lt;/a&gt;&lt;/strong&gt; e compartilhe seu feedback! 🚀&lt;/p&gt;

&lt;p&gt;Espero que gostem 🚀🚀 ☺️&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Artificial Intelligence – Exploring the Future and Its Implications</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Wed, 07 May 2025 05:12:37 +0000</pubDate>
      <link>https://forem.com/jeffotoni/artificial-intelligence-exploring-the-future-and-its-implications-49g7</link>
      <guid>https://forem.com/jeffotoni/artificial-intelligence-exploring-the-future-and-its-implications-49g7</guid>
      <description>&lt;p&gt;“The greatest revolution of our time is not industrial, nor digital — it’s cognitive. And the protagonist is the infamous Artificial Intelligence.”&lt;/p&gt;

&lt;h4&gt;
  
  
  🚀 This post is an expanded summary of our YouTube video.
&lt;/h4&gt;

&lt;p&gt;We recorded a special episode to discuss the real impact of Artificial Intelligence on society, the economy, and the future of software development. Now, with new insights and terms that emerged after the recording — like “Vibe Coding” — we’ve decided to expand the conversation here.&lt;/p&gt;

&lt;p&gt;🎥 Want the full video experience?&lt;br&gt;
👉 Check it out on YouTube: &lt;a href="https://www.youtube.com/watch?v=7vD7u6T9YO8" rel="noopener noreferrer"&gt;Exploring Modern AI&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Artificial Intelligence - From Sci-Fi to Reality
&lt;/h2&gt;

&lt;p&gt;AI is no longer a sci-fi concept. It’s one of the most powerful forces shaping modern society — from voice assistants and recommendation engines to medical diagnostics and artistic creation, AI is transforming our world at an increasingly fast pace.&lt;/p&gt;

&lt;p&gt;In this post, you’ll embark on a complete journey through the AI universe: from its historical roots to social and ethical impacts, practical applications, and visions of the future. Our goal is to deliver a critical, in-depth, yet accessible view of how AI is reshaping the present — and what it means for tomorrow.&lt;/p&gt;

&lt;h2&gt;
  
  
  What Is Artificial Intelligence, Anyway?
&lt;/h2&gt;

&lt;p&gt;Artificial Intelligence is a branch of computer science focused on building systems capable of performing tasks that typically require human intelligence — such as pattern recognition, decision-making, problem-solving, understanding natural language, and even creating art.&lt;/p&gt;

&lt;p&gt;AI can be classified into different levels:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Narrow AI: Specialized in a specific task (e.g., facial recognition, automatic translators).&lt;/li&gt;
&lt;li&gt;General AI (AGI): Capable of performing any intellectual task that a human can.&lt;/li&gt;
&lt;li&gt;Superintelligent AI: A hypothetical future AI that surpasses human intelligence in all aspects.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We currently live in the era of narrow AI, but rapid progress is steering us toward broader and more autonomous systems.&lt;/p&gt;

&lt;h2&gt;
  
  
  A Brief History of AI - From Philosophy to the Data Revolution
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1950 – Alan Turing proposes the Turing Test, asking: “Can machines think?”&lt;/li&gt;
&lt;li&gt;1956 – The Dartmouth Conference officially marks the birth of AI as an academic field.&lt;/li&gt;
&lt;li&gt;1960s–1980s – Symbolic AI and logic-based systems see limited progress.&lt;/li&gt;
&lt;li&gt;1997 – IBM’s Deep Blue defeats world chess champion Garry Kasparov.&lt;/li&gt;
&lt;li&gt;2012 onward – The deep learning boom begins, with powerful neural networks fueled by more data and computing power.&lt;/li&gt;
&lt;li&gt;2016 – DeepMind’s AlphaGo defeats Go champion Lee Sedol, showcasing reinforcement learning’s power.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Since then, models like GPT (OpenAI) and PaLM (Google DeepMind) have begun generating text, images, code, and even music. Welcome to the era of generative AI — where machines no longer just solve problems, they create.&lt;/p&gt;

&lt;h2&gt;
  
  
  Generative AI and LLMs - When Machines Learn to Create
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;LLMs (Large Language Models)&lt;/strong&gt; — such as GPT-3, GPT-4, Claude, Gemini, LLaMA, and others — are trained on billions or even trillions of words from the internet. These models learn linguistic patterns and predict the next word, phrase, or paragraph.&lt;/p&gt;

&lt;p&gt;As a result, they can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Write texts&lt;/li&gt;
&lt;li&gt;Answer questions&lt;/li&gt;
&lt;li&gt;Translate languages&lt;/li&gt;
&lt;li&gt;…and yes, even write code!&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;All you need is a simple natural language prompt — the model returns functions, scripts, entire APIs.&lt;br&gt;
First reaction? “Whoa!” That’s what most people say when they see it in action.&lt;/p&gt;

&lt;p&gt;Welcome to the new age of software development — the era of “Vibe Coding”, where ideas become code through natural language and AI.&lt;/p&gt;

&lt;p&gt;This term didn’t exist when we recorded the video, but we had to include it — it perfectly captures this shift: programming is becoming less about syntax and more about creativity, collaboration, and fluid interaction between humans and machines.&lt;/p&gt;

&lt;p&gt;🎥 Want the full video experience?&lt;br&gt;
👉 Check it out on YouTube: &lt;a href="https://www.youtube.com/watch?v=7vD7u6T9YO8" rel="noopener noreferrer"&gt;Exploring Modern AI&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The Impact Is Huge
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Chatbots have become more natural and helpful&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Translation tools now reach near-human fluency&lt;/li&gt;
&lt;li&gt;Content creators have powerful tools to scale creativity&lt;/li&gt;
&lt;li&gt;Developers code with AI assistants like GitHub Copilot and Cursor AI&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Since our video, the pace has only accelerated&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Claude 3.5 Sonnet, Gemini, GPT-4o — new models flood the market.&lt;/li&gt;
&lt;li&gt;Tools like Windsurf allow you to talk naturally with your codebase.&lt;/li&gt;
&lt;li&gt;JetBrains IDEs (like GoLand) now have native AI assistants.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We’re witnessing a shift programming is evolving into a dialogue, driven by context and intention, not just syntax.&lt;/p&gt;

&lt;p&gt;This post goes beyond our video it’s an expanded reflection on the era in which AI is no longer just a tool but a protagonist in the creative and technical process of building software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ethical Dilemmas and Machine Power
&lt;/h2&gt;

&lt;p&gt;The rise of AI brings complex and deeply human questions:&lt;br&gt;
🔐 Privacy &amp;amp; Surveillance: Facial recognition is used to monitor crowds. Where do we draw the line?&lt;br&gt;
⚖️ Algorithmic Bias: AI trained on human data inherits our biases — racial, gender, economic.&lt;br&gt;
🤖 Autonomy: Should AI decide who gets a transplant, a loan — or fires a weapon in war?&lt;br&gt;
💼 Tech Unemployment: Which jobs will disappear? How do we prepare future generations?&lt;/p&gt;

&lt;p&gt;These aren’t just technical questions — they’re ethical ones. The field of AI ethics is now urgent and interdisciplinary, involving engineers, philosophers, sociologists, and lawmakers.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI vs. Humans - Complement or Replacement?
&lt;/h2&gt;

&lt;p&gt;AI can simulate intelligence — but not consciousness, empathy, or intuition. At least, not yet.&lt;/p&gt;

&lt;p&gt;Imagine a doctor and an AI analyzing the same scan. The algorithm might detect invisible patterns, but only the doctor understands the patient’s emotional history, beliefs, and social context. Human intelligence is contextual, emotional, imperfect — and that’s what makes it irreplaceable.&lt;/p&gt;

&lt;p&gt;The best future is collaborative, not competitive — humans augmented by AI, not replaced by it.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Big Tech Players: Who Controls AI?
&lt;/h2&gt;

&lt;p&gt;Companies like OpenAI, Google DeepMind, Meta, Amazon, and Microsoft are racing for dominance in AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;These corporations:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Invest billions in R&amp;amp;D&lt;/li&gt;
&lt;li&gt;Control the data used to train models&lt;/li&gt;
&lt;li&gt;Set the rules of what AI can and cannot do&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;This raises critical questions:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is AI too concentrated in too few hands?&lt;/li&gt;
&lt;li&gt;How do we ensure transparency and access?&lt;/li&gt;
&lt;li&gt;Is civil society represented in these decisions?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The debate over open vs. closed AI (e.g., Hugging Face vs. OpenAI) is just beginning — and it will shape our future.&lt;/p&gt;

&lt;h2&gt;
  
  
  Real-World Applications of AI 🌍
&lt;/h2&gt;

&lt;p&gt;🩺 Healthcare -  Cancer, cardiac, and neurological diagnoses with superior accuracy; AI-assisted surgeries; large-scale scan analysis; personalized treatments using genomic data&lt;br&gt;
⚖️ Justice - AI analysis of court decisions and petitions helps speed up processes and improve consistency&lt;br&gt;
🌱 Agriculture - Sensors, drones, and predictive models for climate, soil, and pest monitoring; optimized harvests and less waste&lt;br&gt;
📚 Education - Personalized AI tutors that adapt to individual learning styles, boosting inclusion and engagement&lt;br&gt;
🎨 Art &amp;amp; Music - AI composes music, paints, illustrates, writes scripts — expanding human creativity&lt;br&gt;
💼 Business - Customer service automation, market behavior prediction, fraud detection, decision-making support&lt;br&gt;
🚗 Mobility - Autonomous vehicles, traffic management, driver assistance, logistics powered by real-time AI&lt;br&gt;
💻 Software Development - Code generation from natural language, smart IDE assistants, automated testing and documentation&lt;br&gt;
🧬 Molecular Computing - Drug discovery acceleration, protein simulations, molecular interaction analysis, advanced genetic engineering&lt;br&gt;
🏭 Industry - Predictive maintenance, automated quality control via computer vision, real-time supply chain optimization&lt;br&gt;
🛰️ Space &amp;amp; Science - AI in space missions, astronomy image analysis, exoplanet discovery, particle physics simulations&lt;br&gt;
🛡️ Cybersecurity - Threat detection, automated responses, vulnerability scanning based on behavioral patterns&lt;/p&gt;

&lt;p&gt;AI is leaving the labs and impacting real life — at scale.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Future of AI  What’s Coming Next?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Here are some of the most promising (and challenging) frontiers:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Artificial General Intelligence (AGI) - A broader AI capable of learning multiple skills&lt;/li&gt;
&lt;li&gt;Explainable AI (XAI) - Algorithms that explain how they make decisions — crucial in fields like law and healthcare&lt;/li&gt;
&lt;li&gt;Creative AI - Generating original scripts, books, games, videos, and art&lt;/li&gt;
&lt;li&gt;Autonomous AI &amp;amp; Agents: Systems that interact with APIs, apps, and humans in real time&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;And beyond that:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Quantum AI&lt;/li&gt;
&lt;li&gt;Biotech integration&lt;/li&gt;
&lt;li&gt;Brain-machine interfaces&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Yes — we’re just getting started.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts: Opportunity or Threat?
&lt;/h2&gt;

&lt;p&gt;Artificial Intelligence is neither good nor bad by nature — it reflects the intentions of its creators and the data it’s trained on. Like fire, it can warm or destroy.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So we must:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Educate society about AI from an early age&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create democratic and transparent regulations&lt;/li&gt;
&lt;li&gt;Encourage diversity in AI development teams&lt;/li&gt;
&lt;li&gt;Keep humans at the center of technological decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The future of AI is still being written — and all of us: engineers, educators, artists, politicians, parents, and children, have a role to play.&lt;/p&gt;

&lt;h2&gt;
  
  
  Want More?
&lt;/h2&gt;

&lt;p&gt;If you’re passionate about AI and want to explore more content, tutorials, tools, and case studies — follow us on YouTube and across our networks.&lt;/p&gt;

&lt;p&gt;The revolution has already begun.&lt;br&gt;
The only question is:&lt;br&gt;
Will you be a spectator or a protagonist?&lt;/p&gt;

&lt;p&gt;🎥 Want the full video experience?&lt;br&gt;
👉 Check it out on YouTube: &lt;a href="https://www.youtube.com/watch?v=7vD7u6T9YO8" rel="noopener noreferrer"&gt;Exploring Modern AI&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Inteligência Artificial - Explorando o Futuro e Suas Implicações</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Wed, 07 May 2025 03:12:29 +0000</pubDate>
      <link>https://forem.com/jeffotoni/inteligencia-artificial-explorando-o-futuro-e-suas-implicacoes-3mij</link>
      <guid>https://forem.com/jeffotoni/inteligencia-artificial-explorando-o-futuro-e-suas-implicacoes-3mij</guid>
      <description>&lt;h4&gt;
  
  
  “A maior revolução da nossa era não é industrial, nem digital na verdade é cognitiva. E a protagonista é a famigerada Inteligência Artificial.”
&lt;/h4&gt;




&lt;p&gt;🚀 Este post é um resumo expandido do nosso vídeo no YouTube&lt;/p&gt;

&lt;p&gt;Gravamos um episódio especial para discutir o impacto real da Inteligência Artificial na sociedade, na economia e no futuro do desenvolvimento de software. Agora, com novas reflexões e termos que surgiram após a gravação como o &lt;strong&gt;"Vibe Coding"&lt;/strong&gt; decidimos ampliar essa conversa por aqui.&lt;/p&gt;

&lt;p&gt;Se você quiser a experiência completa em vídeo, assista ao episódio no YouTube:&lt;br&gt;
🎥 Confira o vídeo completo no YouTube:&lt;br&gt;
👉 &lt;a href="https://www.youtube.com/watch?v=7vD7u6T9YO8" rel="noopener noreferrer"&gt;youtube - Explorando a AI Moderna&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A Inteligência Artificial (IA) deixou de ser um conceito de ficção científica para se tornar uma das forças mais influentes na transformação da sociedade contemporânea. Presente nos assistentes de voz, algoritmos de recomendação, sistemas de diagnóstico médico e até na criação de arte, a IA está moldando o mundo ao nosso redor em um ritmo acelerado e muitas vezes difícil de acompanhar.&lt;/p&gt;

&lt;p&gt;Neste post, você vai embarcar em uma jornada completa pelo universo da IA: da sua origem histórica aos impactos sociais e éticos, passando por suas aplicações práticas e visões sobre o futuro. Nosso objetivo é apresentar uma visão crítica, profunda e acessível para qualquer pessoa interessada em entender como a inteligência artificial está transformando o presente — e o que isso significa para o amanhã.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Inteligência Artificial, afinal?
&lt;/h2&gt;

&lt;p&gt;A Inteligência Artificial é um ramo da ciência da computação que se concentra no desenvolvimento de sistemas capazes de executar tarefas que normalmente exigiriam inteligência humana, como reconhecer padrões, resolver problemas, tomar decisões, compreender linguagem natural e até mesmo criar arte.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Ela pode ser classificada em diferentes níveis&lt;/strong&gt;&lt;br&gt;
• IA fraca (ou estreita): especializada em uma tarefa específica (ex: reconhecimento facial, tradutores automáticos).&lt;br&gt;
• IA forte (ou geral/AGI): teria a capacidade de realizar qualquer tarefa intelectual que um ser humano consiga.&lt;br&gt;
• IA superinteligente: um conceito hipotético de IA que ultrapassaria a inteligência humana em todos os aspectos.&lt;/p&gt;

&lt;p&gt;Atualmente, vivemos a era da IA estreita, mas os avanços estão nos aproximando rapidamente de cenários mais amplos e autônomos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Breve História da IA das raízes filosóficas à revolução dos dados
&lt;/h2&gt;

&lt;p&gt;A ideia de máquinas pensantes não é nova. Desde a Antiguidade, filósofos especulam sobre a possibilidade de reproduzir a mente humana. No entanto, o campo da IA só começou a se estruturar no século XX.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;1950 - Alan Turing propõe o Teste de Turing, perguntando: “As máquinas podem pensar?”.&lt;/li&gt;
&lt;li&gt;1956 - A conferência de Dartmouth marca o nascimento oficial da IA como disciplina acadêmica.&lt;/li&gt;
&lt;li&gt;Décadas de 60 a 80 - Avanços em regras simbólicas e lógica, mas com resultados limitados.&lt;/li&gt;
&lt;li&gt;Anos 90 - O xadrez tornou marco. Em 1997, o Deep Blue da IBM derrota o campeão Garry Kasparov.&lt;/li&gt;
&lt;li&gt;2012 em diante - A explosão do deep learning com redes neurais profundas, graças ao aumento do poder computacional e grandes volumes de dados, revoluciona o campo.&lt;/li&gt;
&lt;li&gt;2016 - O AlphaGo da DeepMind derrota o campeão mundial Lee Sedol no jogo Go, marcando um salto impressionante na IA com o uso de redes neurais e aprendizado por reforço.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Desde então, modelos como o GPT (OpenAI) e o PaLM (Google DeepMind) passaram a gerar textos, imagens, códigos e até música de forma autônoma. Estamos oficialmente na era da IA generativa — um novo capítulo onde máquinas não apenas resolvem problemas, mas criam.&lt;/p&gt;

&lt;h2&gt;
  
  
  IA Generativa e os LLMs quando a máquina aprende a criar
&lt;/h2&gt;

&lt;p&gt;Os LLMs (Large Language Models), como GPT-3, GPT-4, Claude, Gemini, LLaMA, entre outros, são modelos treinados com bilhões — às vezes trilhões — de palavras retiradas da internet. Esses modelos aprendem padrões da linguagem para prever qual será a próxima palavra, frase ou até parágrafo.&lt;/p&gt;

&lt;p&gt;Com isso, são capazes de gerar textos, responder perguntas, traduzir idiomas e… sim, até escrever código!&lt;/p&gt;

&lt;p&gt;Isso mesmo: código. Basta descrever o que você quer em linguagem natural e o modelo gera funções, scripts, APIs inteiras. Tudo a partir de um simples prompt.&lt;/p&gt;

&lt;p&gt;"Carakas!" É o que muita gente pensa ao ver isso funcionando pela primeira vez.&lt;/p&gt;

&lt;p&gt;Estamos entrando em uma nova era no desenvolvimento de software a era do “Vibe Coding”, onde ideias viram código com o poder da linguagem natural e da inteligência artificial.&lt;/p&gt;

&lt;p&gt;Esse termo ainda não existia quando gravamos o vídeo, mas achamos importante destacá-lo aqui, porque ele define perfeitamente o momento que estamos vivendo. Uma revolução onde programar é menos sobre sintaxe e mais sobre criatividade, colaboração e fluidez entre humanos e máquinas.&lt;/p&gt;

&lt;p&gt;🎥 Confira o vídeo completo no YouTube:&lt;br&gt;
👉 &lt;a href="https://www.youtube.com/watch?v=7vD7u6T9YO8" rel="noopener noreferrer"&gt;youtube - Explorando a AI Moderna&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  O impacto disso é gigantesco
&lt;/h4&gt;

&lt;ol&gt;
&lt;li&gt;Chatbots se tornaram mais naturais e úteis;&lt;/li&gt;
&lt;li&gt;Tradutores automáticos se aproximaram da fluência humana;&lt;/li&gt;
&lt;li&gt;Criadores de conteúdo têm ferramentas poderosas para acelerar e escalar a criatividade;&lt;/li&gt;
&lt;li&gt;Desenvolvedores escrevem códigos com apoio de assistentes como GitHub Copilot ou Cursor AI. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Quando gravamos o episódio, o cenário da inteligência artificial já era impressionante. Mas, como sabemos, nesse universo tudo evolui rápido e desde então muita coisa mudou.&lt;br&gt;
Hoje vivemos uma verdadeira corrida tecnológica o mercado foi inundado por modelos cada vez mais potentes como o Claude 3.5 Sonnet, o avanço acelerado do Gemini e do GPT-4o, e surgiram ferramentas como o Windsurf, que transformam qualquer projeto em uma conversa natural com seu código.&lt;/p&gt;

&lt;p&gt;Além disso, as IDEs também entraram no jogo o ecossistema JetBrains, incluindo o GoLand, já conta com assistentes de IA integrados isso mesmo, nativos na própria IDE. E embora haja um custo para usar esses recursos, o mais importante é que o primeiro passo foi dado: a programação está deixando de ser apenas sintaxe e se tornando diálogo, contexto e intenção.&lt;/p&gt;

&lt;p&gt;Por isso, esse post vai além do conteúdo do vídeo. É um resumo expandido, com reflexões atualizadas sobre a era em que vivemos uma era em que a inteligência artificial deixou de ser suporte e passou a ser protagonista no processo criativo e técnico do desenvolvimento de software.&lt;/p&gt;

&lt;h2&gt;
  
  
  Dilemas Éticos e o Poder das Máquinas
&lt;/h2&gt;

&lt;p&gt;A ascensão da IA levanta dilemas que não são meramente técnicos — são profundamente humanos:&lt;/p&gt;

&lt;p&gt;Privacidade e vigilância Sistemas de reconhecimento facial já são usados para monitorar multidões. Onde está o limite?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Viés algorítmico: IAs treinadas em dados humanos herdam nossos preconceitos. Já houve casos de discriminação racial, de gênero e econômica amplificada por algoritmos.&lt;/li&gt;
&lt;li&gt;Autonomia de decisão: Devemos permitir que uma IA decida quem recebe um transplante de órgão, um crédito bancário ou mesmo atire em um campo de batalha?&lt;/li&gt;
&lt;li&gt;Desemprego tecnológico: Quais profissões vão desaparecer? E como preparar as próximas gerações para um mundo onde a IA será ubíqua?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas perguntas não têm respostas fáceis. Por isso, a ética da IA se tornou um campo de estudo urgente, envolvendo engenheiros, filósofos, sociólogos e legisladores.&lt;/p&gt;

&lt;h2&gt;
  
  
  IA x Ser Humano - Complemento ou Substituição?
&lt;/h2&gt;

&lt;p&gt;A IA pode simular inteligência, mas não consciência, empatia ou intuição. Pelo menos por enquanto.&lt;/p&gt;

&lt;p&gt;Imagine um médico e uma IA analisando um mesmo exame: o algoritmo pode encontrar padrões invisíveis ao olho humano, mas só o médico entende o histórico emocional do paciente, suas crenças, angústias e contexto social. A inteligência humana é situada, afetiva, imperfeita — e é isso que a torna essencial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por isso, o ideal não é que a IA substitua humanos, mas potencialize nossa capacidade. A colaboração entre homem e máquina é o futuro mais promissor.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  O Papel das Big Techs - Quem controla a IA?
&lt;/h2&gt;

&lt;p&gt;Empresas como OpenAI, Google DeepMind, Meta, Amazon e Microsoft estão travando uma corrida pelo domínio da inteligência artificial.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Essas corporações:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Investem bilhões em P&amp;amp;D;&lt;/li&gt;
&lt;li&gt;Controlam os dados usados no treinamento dos modelos;&lt;/li&gt;
&lt;li&gt;Definem os padrões e os limites do que é possível fazer com IA.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Isso levanta questões importantes&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;A IA está concentrada demais nas mãos de poucos?&lt;/li&gt;
&lt;li&gt;Como garantir a transparência e o acesso democrático a essas tecnologias?&lt;/li&gt;
&lt;li&gt;A sociedade civil está representada nessas decisões?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A discussão sobre IA aberta vs. fechada (como &lt;a href="https://huggingface.co" rel="noopener noreferrer"&gt;Hugging Face&lt;/a&gt; vs. OpenAI) está só começando — e será decisiva para o futuro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Casos Reais e Aplicações Incríveis da IA
&lt;/h2&gt;

&lt;p&gt;🩺 Medicina, com diagnósticos de câncer, doenças cardíacas e degenerativas com precisão superior à de especialistas, além de apoio em cirurgias, análise de exames em larga escala e tratamentos personalizados com base em dados genômicos;&lt;/p&gt;

&lt;p&gt;⚖️ Justiça, por meio da análise automatizada de jurisprudências, decisões e petições judiciais para apoiar juízes e advogados, acelerando processos e promovendo mais consistência nas decisões;&lt;/p&gt;

&lt;p&gt;🌱 Agricultura, com sensores, drones e modelos preditivos que monitoram clima, solo e pragas, otimizando colheitas e reduzindo desperdícios com agricultura de precisão;&lt;/p&gt;

&lt;p&gt;📚 Educação, através de tutores personalizados com LLMs que se adaptam ao estilo de aprendizado de cada aluno, promovendo inclusão, engajamento e avanços no ensino remoto;&lt;/p&gt;

&lt;p&gt;🎨 Música e arte, com algoritmos que compõem trilhas sonoras, criam ilustrações, pintam em estilos específicos e até escrevem roteiros, ampliando o potencial criativo humano;&lt;/p&gt;

&lt;p&gt;💼 Negócios, com IA aplicada ao atendimento ao cliente, análise preditiva de comportamento de mercado, detecção de fraudes, automação de processos e suporte à tomada de decisão;&lt;/p&gt;

&lt;p&gt;🚗 Mobilidade, com veículos autônomos, gerenciamento inteligente de tráfego, assistentes de direção e planejamento logístico em tempo real com base em IA embarcada;&lt;/p&gt;

&lt;p&gt;💻 Programação, com geração de código a partir de linguagem natural, assistentes inteligentes integrados às IDEs, automação de testes, refatoração e até geração de documentações técnicas;&lt;/p&gt;

&lt;p&gt;🧬 Computação molecular, com IA acelerando a descoberta de novos medicamentos, simulações de proteínas, análise de interações moleculares e projetos de engenharia genética de altíssimo nível;&lt;/p&gt;

&lt;p&gt;🏭 Indústria e manufatura, com manutenção preditiva, controle de qualidade automatizado por visão computacional e otimização da cadeia de suprimentos em tempo real;&lt;/p&gt;

&lt;p&gt;🛰️ Espaço e ciência, com modelos de IA auxiliando em missões espaciais, análise de imagens astronômicas, descoberta de exoplanetas e simulações de física de partículas;&lt;/p&gt;

&lt;p&gt;🛡️ Segurança cibernética, com detecção proativa de ameaças, respostas automatizadas a ataques e análise de vulnerabilidades com base em padrões de comportamento e anomalias.&lt;/p&gt;

&lt;p&gt;A IA está saindo dos laboratórios e impactando a vida real, em escala.&lt;/p&gt;

&lt;h2&gt;
  
  
  O Futuro da Inteligência Artificial o que vem por aí?
&lt;/h2&gt;

&lt;p&gt;Entre as tendências mais promissoras (e também mais desafiadoras), estão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;IA Generalista (AGI), uma IA que aprende de forma ampla, com múltiplas habilidades.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IA Explicável (XAI), algoritmos que mostram como tomam decisões — essencial para áreas críticas como medicina e justiça.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IA Criativa, geração de roteiros, livros, vídeos, jogos e conteúdo 100% inédito.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;IA Autônoma e Agentes Inteligentes, sistemas que tomam decisões e interagem com APIs, sistemas e pessoas em tempo real.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Além disso, a IA quântica, a fusão com biotecnologia e o surgimento de interfaces cérebro-máquina indicam que estamos só no começo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Considerações Finais - Oportunidade ou Ameaça?
&lt;/h2&gt;

&lt;p&gt;A Inteligência Artificial não é boa nem má por natureza ela é reflexo de quem a cria, de como é treinada e de para que é usada. Assim como o fogo pode aquecer ou destruir, a IA pode empoderar ou oprimir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Por isso, precisamos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Educar a sociedade sobre IA desde cedo;&lt;/li&gt;
&lt;li&gt;Criar regulações transparentes e democráticas;&lt;/li&gt;
&lt;li&gt;Incentivar a diversidade nas equipes de IA;&lt;/li&gt;
&lt;li&gt;Manter o ser humano no centro das decisões tecnológicas.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;O futuro da IA ainda está em construção, e todos nós engenheiros, educadores, artistas, políticos, pais e filhos temos um papel vital nesse processo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quer ir além?
&lt;/h2&gt;

&lt;p&gt;Se você se interessa por Inteligência Artificial e quer acompanhar conteúdos aprofundados, tutoriais, estudos de caso e análises de ferramentas, fique ligado aqui no canal e nas nossas redes.&lt;/p&gt;

&lt;p&gt;A revolução já começou. A pergunta é: &lt;strong&gt;você vai ser espectador ou protagonista?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Se você quiser a experiência completa em vídeo, assista ao episódio no YouTube:&lt;br&gt;
🎥 Confira o vídeo completo no YouTube:&lt;br&gt;
👉 &lt;a href="https://www.youtube.com/watch?v=7vD7u6T9YO8" rel="noopener noreferrer"&gt;youtube - Explorando a AI Moderna&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Workloads: CPU-Bound and IO-Bound</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Sat, 01 Mar 2025 22:43:21 +0000</pubDate>
      <link>https://forem.com/jeffotoni/workloads-cpu-bound-and-io-bound-4f1b</link>
      <guid>https://forem.com/jeffotoni/workloads-cpu-bound-and-io-bound-4f1b</guid>
      <description>&lt;h2&gt;
  
  
  What is a Workload? And why are we talking about it?
&lt;/h2&gt;

&lt;p&gt;Could it be to better understand when to use concurrency in Go❤️?&lt;/p&gt;

&lt;p&gt;The answer to this question is yes 😁 and not just for Go, but for any technology that deals with parallelism and concurrency 😁.&lt;/p&gt;

&lt;p&gt;A workload refers to the amount of work an application needs to perform. In other words, a workload is the set of tasks or operations an application must execute to meet its requirements👊🏼.&lt;/p&gt;

&lt;p&gt;Workloads can be distributed across multiple processes or threads to improve application performance. For example, if an application has a CPU-intensive workload, it can be broken down into smaller parts that run in parallel across multiple cores.&lt;/p&gt;

&lt;p&gt;Workloads can also be distributed across multiple machines to enhance application scalability. For instance, if an application has an I/O-intensive workload, it can be distributed among several servers to improve user request handling capacity.&lt;/p&gt;

&lt;p&gt;Therefore, we can say that a workload is the amount of work an application needs to process, and it plays a crucial role in choosing the right approach for concurrency or parallelism. Proper workload distribution can significantly improve performance and scalability.&lt;/p&gt;

&lt;p&gt;Concurrency in Go is incredibly powerful yet simple—this was the intention of the engineers who designed Go. Many problems can be solved far more efficiently using concurrency, and this is where Go shines. That’s why Go has become a God when it comes to backend concurrency.&lt;/p&gt;

&lt;p&gt;Because of this, problems in this domain can be solved with high efficiency while using very few computational resources.🚀&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Example of a Worker in Go:&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;Every Go program starts by defining the &lt;code&gt;package&lt;/code&gt; and importing the necessary libraries.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"time"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This function is our &lt;strong&gt;Worker&lt;/strong&gt;, which runs concurrently as a &lt;strong&gt;goroutine&lt;/strong&gt; while the rest of the code continues execution.&lt;/p&gt;

&lt;p&gt;Let's break down the &lt;strong&gt;parameters&lt;/strong&gt; and understand &lt;strong&gt;channels&lt;/strong&gt;, which are the mechanism for safely passing values between &lt;strong&gt;goroutines&lt;/strong&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;jobs &amp;lt;-chan int&lt;/code&gt;: This is an &lt;strong&gt;input channel&lt;/strong&gt; (receive-only).
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;results chan&amp;lt;- int&lt;/code&gt;: This is an &lt;strong&gt;output channel&lt;/strong&gt; (send-only).
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;result2 chan string&lt;/code&gt;: This is a &lt;strong&gt;bidirectional channel&lt;/strong&gt;, meaning that inside the function, you can &lt;strong&gt;both send and receive&lt;/strong&gt; values through it.
&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Worker Function in Go&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="k"&gt;chan&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"worker:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"started  job"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"worker:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"finished job"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;8&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, we initialize our program by &lt;strong&gt;declaring the channels&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We launch multiple &lt;strong&gt;goroutines&lt;/strong&gt; of our worker to &lt;strong&gt;distribute the workload&lt;/strong&gt; efficiently.&lt;br&gt;&lt;br&gt;
In this case, we are spawning &lt;strong&gt;three concurrent workers&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Main Function: Spawning Workers and Distributing Workloads&lt;/strong&gt;
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;// Launching 3 worker goroutines&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="c"&gt;// Sending 5 jobs to the workers&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;

        &lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="c"&gt;// Collecting results from the workers&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
                &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;
        &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Go is designed to handle &lt;strong&gt;concurrency&lt;/strong&gt; efficiently and safely.&lt;br&gt;&lt;br&gt;
Concurrency is achieved through &lt;strong&gt;goroutines&lt;/strong&gt;, which are small pieces of code that can run concurrently but not necessarily in parallel.  &lt;/p&gt;

&lt;p&gt;Goroutines are &lt;strong&gt;lightweight in terms of resources&lt;/strong&gt;, meaning that thousands of them can be created in a single program without degrading performance.  &lt;/p&gt;

&lt;p&gt;The Go &lt;strong&gt;runtime&lt;/strong&gt; decides whether a &lt;strong&gt;goroutine&lt;/strong&gt; runs concurrently or in parallel across multiple CPU cores, depending on resource availability and the number of physical cores available.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Communication Between Goroutines&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Communication between &lt;strong&gt;goroutines&lt;/strong&gt; is done through &lt;strong&gt;channels&lt;/strong&gt;, synchronization mechanisms that allow &lt;strong&gt;safe data transfer&lt;/strong&gt; between goroutines. This enables goroutines to work together, sharing data and cooperating to achieve a common goal.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Concurrency in Go’s net/http Package&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;code&gt;net/http&lt;/code&gt; package works &lt;strong&gt;concurrently&lt;/strong&gt;, scaling requests and distributing computational resources more effectively.  &lt;/p&gt;

&lt;p&gt;If you're interested in benchmarks on this topic and comparisons with different programming languages, check out this link:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://github.com/jeffotoni/benchmark" rel="noopener noreferrer"&gt;benchmark&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here, you can see the power of &lt;code&gt;net/http&lt;/code&gt; when abstracted by the &lt;strong&gt;Quick&lt;/strong&gt; framework (&lt;a href="https://github.com/jeffotoni/quick" rel="noopener noreferrer"&gt;quick&lt;/a&gt;), developed in Go, which utilizes &lt;code&gt;net/http&lt;/code&gt;.&lt;br&gt;&lt;br&gt;
It’s also compared against &lt;strong&gt;Elixir&lt;/strong&gt;, a functional and concurrent programming language.  &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fto65phph5o3mb3zkhl7s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fto65phph5o3mb3zkhl7s.png" alt="Elixir vs Quick" width="800" height="310"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;Understanding Workloads in Concurrency&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;When talking about &lt;strong&gt;concurrency&lt;/strong&gt;, it is important to highlight different &lt;strong&gt;types of workloads&lt;/strong&gt;, as they act as a &lt;strong&gt;compass&lt;/strong&gt; to help us determine the right balance when solving concurrency-related problems.&lt;/p&gt;

&lt;p&gt;A &lt;strong&gt;thread&lt;/strong&gt; can handle two types of workloads (&lt;strong&gt;Workloads&lt;/strong&gt;):&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;CPU-Bound&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
✅ &lt;strong&gt;I/O-Bound&lt;/strong&gt;  &lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;strong&gt;CPU-BOUND&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;This type of workload never puts a &lt;strong&gt;thread&lt;/strong&gt; into a &lt;em&gt;waiting state&lt;/em&gt;.&lt;br&gt;&lt;br&gt;
It is constantly performing calculations. A thread computing &lt;strong&gt;pi&lt;/strong&gt; to the eighteenth power, for example, would be &lt;strong&gt;CPU-limited&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;em&gt;(Fun fact:&lt;/em&gt; &lt;a href="https://en.wikipedia.org/wiki/Emma_Haruka_Iwao" rel="noopener noreferrer"&gt;&lt;strong&gt;Emma Haruka Iwao&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;is a Japanese computer scientist and Cloud Developer Engineer at Google. In 2019, she calculated the most precise value of pi ever recorded, reaching 31.4 trillion digits.)&lt;/em&gt;  &lt;/p&gt;

&lt;p&gt;For &lt;strong&gt;CPU-bound&lt;/strong&gt; workloads, &lt;strong&gt;parallelism&lt;/strong&gt; is needed to maximize simultaneous execution. However, simply increasing the number of &lt;strong&gt;goroutines&lt;/strong&gt; will not help and may even degrade performance.&lt;br&gt;&lt;br&gt;
This happens because of the &lt;strong&gt;latency cost&lt;/strong&gt; (the time spent) in &lt;strong&gt;moving goroutines in and out&lt;/strong&gt; of the OS thread.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;I/O-BOUND&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;In this type of workload, &lt;strong&gt;threads enter waiting states&lt;/strong&gt;.&lt;br&gt;&lt;br&gt;
A good example is &lt;strong&gt;network requests&lt;/strong&gt; or &lt;strong&gt;system calls&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;A thread that needs to:  &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Access a &lt;strong&gt;database&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Perform &lt;strong&gt;synchronization events&lt;/strong&gt; (&lt;em&gt;mutex, atomic&lt;/em&gt;)
&lt;/li&gt;
&lt;li&gt;Communicate over a &lt;strong&gt;network&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;…will have to &lt;strong&gt;wait&lt;/strong&gt;, making it an &lt;strong&gt;I/O-bound&lt;/strong&gt; workload.  &lt;/p&gt;

&lt;p&gt;For this type of workload, &lt;strong&gt;parallelism is not necessary&lt;/strong&gt; to achieve concurrency—a single &lt;strong&gt;physical core&lt;/strong&gt; is often enough to efficiently handle &lt;strong&gt;multiple goroutines&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goroutines&lt;/strong&gt; enter and exit waiting states as part of their workload.&lt;/p&gt;

&lt;p&gt;Having &lt;strong&gt;more goroutines&lt;/strong&gt; than physical cores can &lt;strong&gt;speed up execution&lt;/strong&gt; since the latency cost of moving goroutines between OS threads is &lt;strong&gt;not&lt;/strong&gt; creating an additional bottleneck.  &lt;/p&gt;

&lt;p&gt;Instead, &lt;strong&gt;work is naturally interrupted&lt;/strong&gt;, allowing another &lt;strong&gt;goroutine&lt;/strong&gt; to utilize the same physical core instead of letting it remain idle.&lt;/p&gt;




&lt;h3&gt;
  
  
  &lt;strong&gt;CONCLUSION&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;The &lt;strong&gt;Go&lt;/strong&gt; programming language provides &lt;strong&gt;powerful&lt;/strong&gt; and &lt;strong&gt;easy-to-use&lt;/strong&gt; tools for handling &lt;strong&gt;concurrency&lt;/strong&gt;, making it an excellent choice for &lt;strong&gt;high-performance and scalable&lt;/strong&gt; applications.  &lt;/p&gt;

&lt;p&gt;Understanding &lt;strong&gt;when to use parallelism across multiple physical cores&lt;/strong&gt; vs. &lt;strong&gt;when simple concurrency on fewer cores (or a single core) is sufficient&lt;/strong&gt; is essential.  &lt;/p&gt;

&lt;p&gt;Go offers various &lt;strong&gt;patterns&lt;/strong&gt; to &lt;strong&gt;balance&lt;/strong&gt; these workloads, and in some cases, you may need a combination of &lt;strong&gt;both approaches&lt;/strong&gt;.  &lt;/p&gt;

&lt;p&gt;Want to dive deeper into this topic? Check out this post:&lt;br&gt;&lt;br&gt;
👉 &lt;a href="https://dev.to/jeffotoni/golang-simplifying-complexity-the-beginning-i7k"&gt;&lt;em&gt;Simplifying Complexity: The Beginning&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Hope you like it!! 🚀😃&lt;/strong&gt;  &lt;/p&gt;

</description>
    </item>
    <item>
      <title>Getters e setters muito conhecido em “Java” é comum o seu uso em Go?</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Fri, 08 Sep 2023 04:33:27 +0000</pubDate>
      <link>https://forem.com/jeffotoni/getters-e-setters-muito-conhecido-em-java-e-comum-o-seu-uso-em-go-4bg2</link>
      <guid>https://forem.com/jeffotoni/getters-e-setters-muito-conhecido-em-java-e-comum-o-seu-uso-em-go-4bg2</guid>
      <description>&lt;p&gt;Antes de iniciarmos temos que definir alguns conceitos importantes que a pergunta nos força a refletir.&lt;/p&gt;

&lt;p&gt;Os conceitos de "getters" e "setters" são fundamentais para a programação orientada a objetos (OOP) e estão intimamente ligados ao princípio do encapsulamento, um dos pilares da OOP. O encapsulamento envolve a restrição do acesso direto a alguns dos componentes de um objeto e a provisão de métodos públicos (como getters e setters) para manipular esses componentes.&lt;/p&gt;

&lt;p&gt;Poderíamos dizer que a origem ao conceito de getters e setters se da com a criação do paradigma de programação orientado a objeto e elas emergiram na década de 1980 e evoluíram rapidamente. No entanto, linguagens como Smalltalk, uma das primeiras linguagens orientadas a objetos, já tinham conceitos que permitiam o encapsulamento de propriedades de objetos. Mais tarde, linguagens como C++ e Java popularizaram o uso de métodos específicos para acessar e modificar propriedades privadas, que se tornaram conhecidos como getters e setters.&lt;/p&gt;

&lt;p&gt;Quando referenciamos ao getters e setters eles não são um "padrão arquitetural", eles são mais um padrão de design ou uma prática de desenvolvimento que facilita o encapsulamento. No entanto, eles são usados em muitos padrões de design e arquitetura. Por exemplo, no padrão de design "Bean" em Java, o uso de getters e setters é padrão.&lt;/p&gt;

&lt;p&gt;Getters e setters permitem o controle sobre como um atributo é acessado ou modificado. Eles podem incluir lógica adicional, como validação, ou podem ser usados para criar atributos somente leitura e é este o motivo de sua utilização independente da linguagem de programação que venha utiliza-lo.&lt;/p&gt;

&lt;p&gt;Sua utilização também podem ser vistos como verbosos, especialmente em linguagens onde a definição de cada getter e setter pode exigir várias linhas de código a mais. Além disso, o uso excessivo de getters e setters pode ser um sinal de que pode está fazendo muito ou violando o princípio da responsabilidade única.&lt;/p&gt;

&lt;p&gt;Enquanto o conceito de encapsulamento é fundamental para a programação orientada a objetos, a forma como esse encapsulamento é implementado, seja através de getters e setters ou outros mecanismos, varia entre linguagens e frameworks.&lt;/p&gt;

&lt;p&gt;Olha o exemplo feito em Smalltalk a primeira linguagem de Programação Orientada a Objeto como é escrito:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight smalltalk"&gt;&lt;code&gt;&lt;span class="nc"&gt;Object&lt;/span&gt; &lt;span class="nf"&gt;subclass:&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="nv"&gt;nome&lt;/span&gt; &lt;span class="nf"&gt;idade&lt;/span&gt; &lt;span class="nf"&gt;|&lt;/span&gt;

    &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="nf"&gt;class&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;new&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="bp"&gt;super&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt; &lt;span class="nf"&gt;initialize&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="nf"&gt;Pessoa&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;initialize&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nv"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
        &lt;span class="nv"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c"&gt;"Getters"&lt;/span&gt;
    &lt;span class="nf"&gt;Pessoa&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;nome&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="nv"&gt;nome&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="nf"&gt;Pessoa&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nv"&gt;idade&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="o"&gt;^&lt;/span&gt;&lt;span class="nv"&gt;idade&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="c"&gt;"Setters"&lt;/span&gt;
    &lt;span class="nf"&gt;Pessoa&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;nome:&lt;/span&gt; &lt;span class="nv"&gt;umNome&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nv"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nv"&gt;umNome&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;

    &lt;span class="nf"&gt;Pessoa&lt;/span&gt; &lt;span class="nf"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;idade:&lt;/span&gt; &lt;span class="nv"&gt;umaIdade&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
        &lt;span class="nv"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nv"&gt;umaIdade&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;]&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora confira como é instânciada e chamado os métodos.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight smalltalk"&gt;&lt;code&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="nv"&gt; jeff &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
&lt;span class="nv"&gt;jeff&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;jeff&lt;/span&gt; &lt;span class="nf"&gt;nome:&lt;/span&gt; &lt;span class="s"&gt;'jeffotoni'&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nv"&gt;jeff&lt;/span&gt; &lt;span class="nf"&gt;idade:&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;

&lt;span class="nc"&gt;Transcript&lt;/span&gt; &lt;span class="nf"&gt;show:&lt;/span&gt; &lt;span class="nv"&gt;jeff&lt;/span&gt; &lt;span class="nf"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nf"&gt;cr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;span class="nc"&gt;Transcript&lt;/span&gt; &lt;span class="nf"&gt;show:&lt;/span&gt; &lt;span class="nv"&gt;jeff&lt;/span&gt; &lt;span class="nf"&gt;idade&lt;/span&gt; &lt;span class="nf"&gt;printString&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nf"&gt;cr&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No java teríamos algo assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;private&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;

    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Getter para nome&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Setter para nome&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Getter para idade&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// Setter para idade&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;setIdade&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora olha como fica sua instância:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;static&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="o"&gt;[]&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="nc"&gt;Pessoa&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Pessoa&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
        &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setNome&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"jeffotoni"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
        &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;setIdade&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;35&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;

        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getNome&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
        &lt;span class="nc"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Idade: "&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;getIdade&lt;/span&gt;&lt;span class="o"&gt;());&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  E em Go ?
&lt;/h2&gt;

&lt;p&gt;Sabemos que Go não é orientado a objeto não da forma que conhecemos como Java, C++ ou C#.  Para mais detalhes pode ler o meu post sobre este assunto clicando neste link: &lt;a href="https://dev.to/jeffotoni/go-e-orientada-a-objetos-3gf9"&gt;Go é orientado a objetos ?&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Go não suporta classes e nem heranças ele não foi construído para um designer de paradigma orientado a objeto. No entanto, Go oferece recursos que permitem aos desenvolvedores alcançar objetivos semelhantes ao da programação orientada a objetos, principalmente através de structs e interfaces que também tem um comportamento diferente do que conhecemos nas linguagens de programação Java, C++ ou C#.&lt;/p&gt;

&lt;p&gt;Em Go temos struct, uma struct é uma coleção de campos, que podem ter diversos tipos. Elas são comparáveis aos registros em algumas outras linguagens. Uma struct define um tipo de dados que agrupa variáveis relacionadas.&lt;/p&gt;

&lt;p&gt;Logo abaixo uma struct pública e com campos públicos em Go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Nome&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="c"&gt;// público&lt;/span&gt;
    &lt;span class="n"&gt;Idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="c"&gt;// público&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então, o que temos até o momento é uma forma de fazer polimorfismo utilizando "interface", encapsulamento de métodos e disponibiliza-los de forma dinâmica muito semelhante ao "Duck typing". E para complementar a grande maioria dos patterns possíveis a serem feitos em Go usam interface, dentre eles: Abstract Factory, Adapter, Builder, Bridge, Composite, Prototype , Decorator.    &lt;/p&gt;

&lt;p&gt;Logo abaixo um exemplo de utilização de interface, struct e método Go para facilitar nosso entendimento em nosso exemplo da struct Pessoa.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Apresentavel&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Apresentar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Nome&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Apresentar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Olá! Meu nome é %s e eu tenho %d anos."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Estudante&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Pessoa&lt;/span&gt;
    &lt;span class="n"&gt;Curso&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;e&lt;/span&gt; &lt;span class="n"&gt;Estudante&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Apresentar&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Meu nome é %s, eu tenho %d anos e estudo %s."&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Curso&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em nosso exemplo acima tanto Pessoa quanto Estudante implementam a interface Apresentavel. A função main demonstra polimorfismo, pois tanto pessoa1 quanto pessoa2 são tratados como tipos Apresentavel, mas seus comportamentos são diferentes.&lt;/p&gt;

&lt;p&gt;Confira nossa função main logo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;func main() {
    var pessoa1 Apresentavel = Pessoa{"Silver Gama", 28}
    var pessoa2 Apresentavel = Estudante{Pessoa{"jeffotoni", 21}, "Ciência da Computação"}

    fmt.Println(pessoa1.Apresentar())
    fmt.Println(pessoa2.Apresentar())
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso queira executar e brincar basta clicar no neste link &lt;a href="https://go.dev/play/p/NaWdZaSYB2o" rel="noopener noreferrer"&gt;Polimorfismo em Go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Em Go, a visibilidade de membros de uma struct (ou funções em um pacote) é controlada pela primeira letra do identificador. Se começar com uma letra maiúscula, é permitido ser exportado ou melhor acessada fora do pkg Go (equivalente a public em linguagens como Java); caso contrário, é unexported (semelhante a private) ou seja não poderá ser acessado fora do pkg Go. &lt;/p&gt;

&lt;p&gt;Em nosso exemplo acima se criarmos um pacote as a primeira letra maiúscula do nome da nossa struct e seus respectivos campos isto significa que nossa struct é pública e poderá ser instanciada ou acessada de forma externa. &lt;/p&gt;

&lt;p&gt;Go não tem uma sintaxe específica para getters e setters como algumas linguagens OOP. Em vez disso, você simplesmente usa métodos. Por causa das convenções de nomenclatura em Go, getters e setters normalmente não são prefixados com "Get" ou "Set" e podemos fazer da forma que convier e conforme a necessidade do projeto e cenários, porém alguns desenvolvedores preferem manter a sintaxe por uma melhor prática pois são poliglotas e conhecendo de OOP pode utilizar da mesma sintaxe para facilitar a legibilidade e o entendimento do seus códigos Go.   &lt;/p&gt;

&lt;p&gt;Antes de mostrar a abordagem com getters e setters vamos ver a abordagem mais direta e bem prática de como fazemos em Go.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Nome&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;jeff&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"jeffotoni"&lt;/span&gt;
    &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Idade:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para acessar o Código basta clicar no link: &lt;a href="https://go.dev/play/p/stksC-V969O" rel="noopener noreferrer"&gt;Struct em Go&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Neste exemplo, Nome e Idade são campos exportados da struct Pessoa. Isso significa que você pode acessar e modificar esses campos diretamente, como demonstrado na função main, e quando criado um pacote em Go também isto é importante dizer.&lt;/p&gt;

&lt;p&gt;Esta abordagem é mais direta e é frequentemente preferida em Go quando não há necessidade de lógica adicional ao definir ou obter o valor de um campo. &lt;/p&gt;

&lt;p&gt;Só para reforçar, se criar um pkg em Go irá conseguir fazer import deste pkg em seu projeto e fazer a chamada da sua struct igual o exemplo do main acima.&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando usar Getters e Setters em Go?
&lt;/h2&gt;

&lt;p&gt;Só para reforçar estamos utilizando do conceito "getters e setters" não é obrigatório o seu uso com nomes específicos e nem sua obrigatoriedade para encapsulamento em Go você tem a liberdade de escolha, repetindo: "getters e setters é um  padrão de design ou uma prática de desenvolvimento que facilita o encapsulamento".&lt;/p&gt;

&lt;p&gt;Quando necessitar de validações, lógicas adicionais ao acessar ou modificar os campos, quando precisar fazer isto temos um bom motivo em deixar nossos campos da struct private ou seja com a primeira letra minúscula e criarmos métodos sejam eles com interface ou não, para fazer todo o controle e também podemos deixar a struct private para que todo seu controle seja feito pelo seu pkg.&lt;/p&gt;

&lt;p&gt;Aqui temos duas abordagens diferentes campos da struct private e struct private.&lt;/p&gt;

&lt;p&gt;Aqui o exemplo de uma struct publica que pode ser exposta e campos privados sendo controlados por métodos em Go:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Pessoa&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;nome&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora observe nossos métodos como ficariam:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Getter para nome&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Setter para nome&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;SetNome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Getter para idade&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Setter para idade&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;SetIdade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui temos getters e setters para os campos nome e idade da struct Pessoa. Eles são implementados como métodos da struct.&lt;/p&gt;

&lt;p&gt;Olha aqui nossa função main utilizando nossos métodos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;jeff&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;Pessoa&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
    &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetNome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"jeff"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SetIdade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;30&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Idade:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A outra abordagem seria deixar a struct private desta forma não consegue acessar a struct diretamente somente através de métodos. Nesta abordagem temos uma função que faz o papel de um construtor. Em linguagens de programação orientadas a objetos, como Java, C++ ou C# construtores são métodos especiais que são usados para inicializar uma instância de uma classe. Esses construtores permitem definir valores iniciais, alocar recursos, ou realizar outras tarefas de inicialização necessárias para o objeto.&lt;/p&gt;

&lt;p&gt;Go, sendo uma linguagem que não é tradicionalmente orientada a objetos, não tem um conceito embutido de "construtor" como essas linguagens. No entanto, é comum em Go criar uma função que serve o mesmo propósito que um construtor em outras linguagens. Esta função geralmente começa com "New" (mas vai de projeto a projeto não é regra) e retorna uma instância da struct.&lt;/p&gt;

&lt;p&gt;Confira o exemplo abaixo de como ficaria nossa função construtora e os métodos getters e setters.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;pessoa&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;nome&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora confira nosso "construtor" como ficaria:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nossos métodos ficaram assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// Getter para nome&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Setter para nome&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;SetNome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nome&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Getter para idade&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Setter para idade&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;SetIdade&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;idade&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos ver como fazemos a instanciação e chamamos isto em nosso main.&lt;/p&gt;

&lt;p&gt;Confira o código abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;jeff&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;New&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"jeffotoni"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;35&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Idade:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jeff&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Gostaria de rodar o código completo click neste link: &lt;a href="https://go.dev/play/p/9CZOIA5MKKs" rel="noopener noreferrer"&gt;Go e construtor "New"&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  E as vulnerabilidades ?
&lt;/h2&gt;

&lt;p&gt;Ao exportar structs e seus campos em Go (ou seja, torná-los públicos, começando com uma letra maiúscula), estamos permitindo que outros pacotes os acessem diretamente. Isso pode levar há algumas reflexões que irá precisar fazer quando estiver desenvolvendo seus pacotes em Go.&lt;/p&gt;

&lt;h2&gt;
  
  
  Encapsulamento Quebrado
&lt;/h2&gt;

&lt;p&gt;Uma das principais preocupações é o potencial para quebrar o encapsulamento. Quando você exporta um campo, qualquer código fora do pacote pode alterá-lo diretamente. Se existir uma necessidade no meio do caminho ou seja não foi percebido antes de criar o pacote e precisar colocar ou criar uma lógica interna ou invariáveis que precisam ser mantidas, o acesso direto pode levar a estados inconsistentes ou inválidos, em outras palavras  poderá quebrar seu pacote.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manutenibilidade
&lt;/h2&gt;

&lt;p&gt;Se outros pacotes começarem a depender diretamente dos campos exportados, pode ser difícil mudar a estrutura interna da sua struct no futuro. Qualquer mudança pode quebrar o código que depende dela.&lt;/p&gt;

&lt;h2&gt;
  
  
  Segurança
&lt;/h2&gt;

&lt;p&gt;Em alguns casos, pode haver preocupações de segurança acredito que muito poucos mesmo. Por exemplo, se um campo exportado contiver informações sensíveis, ele poderia, em teoria, ser lido ou modificado por código mal-intencionado em outro pacote mas para isto ocorrer você precisaria instanciá-lo no pacote de alguma forma.&lt;/p&gt;

&lt;h2&gt;
  
  
  Escondendo Detalhes de Implementação
&lt;/h2&gt;

&lt;p&gt;Ao exportar campos, você está expondo detalhes de implementação que talvez preferisse manter ocultos. Esconder detalhes de implementação pode tornar seu código mais fácil de usar e menos propenso a erros isto é fato.&lt;/p&gt;

&lt;h2&gt;
  
  
  Validações
&lt;/h2&gt;

&lt;p&gt;Se certas validações ou lógicas devem ser aplicadas ao definir valores em sua struct, exportar campos diretamente contorna essas validações, a menos que você dependa de métodos de setter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Só para reforçar utilizei do conceito "Getters e Setters" que é um padrão de designer para abordar como poderíamos encapsular nossas structs em Go, relembrando que não é obrigatório é somente uma prática de desenvolvimento que é bem comum dos desenvolvedores que veem de java para Go.&lt;/p&gt;

&lt;p&gt;Ao projetar structs e pacotes em Go, é importante ponderar cuidadosamente as vantagens e desvantagens de exportar campos. Em muitos casos, a decisão dependerá das necessidades específicas e trade-offs do projeto.&lt;/p&gt;

&lt;p&gt;Enquanto o Go certamente permite e, em alguns casos, incentiva o uso direto de campos exportados para simplicidade, há situações em que usar getters e setters é benéfico. O uso de getters e setters em Go, como em muitas outras linguagens, está relacionado a práticas de encapsulamento e controle sobre como os dados de uma struct ou tipo são acessados e modificados.&lt;/p&gt;

&lt;p&gt;Espero que tenha gostado do resumo e uma breve introdução do que podemos fazer em Go quando o assunto é getters e setters. Qualquer observação, dica, melhoria etc.. no conteúdo por favor só enviar para melhora-lo ainda mais.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Proxies e API Gateway: Uma Profunda Jornada através do Tempo e Código</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Tue, 29 Aug 2023 12:50:40 +0000</pubDate>
      <link>https://forem.com/jeffotoni/proxies-e-api-gateway-uma-profunda-jornada-atraves-do-tempo-e-codigo-15mg</link>
      <guid>https://forem.com/jeffotoni/proxies-e-api-gateway-uma-profunda-jornada-atraves-do-tempo-e-codigo-15mg</guid>
      <description>&lt;p&gt;Desde do inicio da era digital para web, a maneira como os sistemas se comunicam passou por várias transformações. Na última década, particularmente a partir da metade dos anos 2000, vivenciamos um bum na utilização de APIs (Interfaces de Programação de Aplicativos). As APIs permitiram que aplicações independentes se conectassem e compartilhassem dados de forma fluida e segura, dando origem a uma onda de inovação e interconexão sem precedentes.&lt;/p&gt;

&lt;p&gt;Na virada do milênio, em 2000, Roy Fielding apresentou uma tese de doutorado introduzindo o conceito de Representational State Transfer (REST) como um estilo arquitetural. Esta proposta foi incorporada ao protocolo HTTP  &lt;/p&gt;

&lt;p&gt;A natureza simples, porém poderosa, do REST começou a ganhar destaque ao longo da década, mas foi realmente nos anos 2010 que vimos uma adoção massiva do REST, levando ao declínio de padrões anteriores, como o SOAP. O protocolo REST, que utiliza padrões da web como HTTP e JSON, promoveu uma maior aceitação e implementação devido à sua simplicidade, até o presente momento, continua sendo o padrão dominante para serviços expostos na web.&lt;/p&gt;

&lt;p&gt;Com o sucesso e a proliferação das APIs RESTful, a web começou a mudar. Empresas como Twitter, Facebook e Google amplamente adotaram e promoveram o uso de suas APIs, possibilitando a criação de uma infinidade de aplicações de terceiros e integrando-as em ecossistemas muito maiores.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Era dos Proxies Reversos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O gerenciamento de tráfego na web para atender a grande demanda de APIs como citamos acima, teve que passar por uma série de transformações significativas ao longo das décadas. Em 1995, o Apache foi lançado e rapidamente se estabeleceu como o servidor web padrão, dominando a cena da internet no final dos anos 90 e início dos anos 2000. Entretanto, com a evolução das linguagens de programação e a necessidade de servidores de aplicação, em 1999 foi apresentado o Apache Tomcat, projetado para executar aplicações Java em ambiente web. Esta era também testemunhou o surgimento e a popularização das APIs, culminando na proliferação dos serviços baseados em nuvem. &lt;/p&gt;

&lt;p&gt;Com essa rápida escalabilidade, houve a demanda por soluções mais performáticas e adaptadas às novas cargas de trabalho. Em 2004, o NGINX foi introduzido como uma alternativa leve ao Apache, e, com sua capacidade de lidar com um grande número de conexões simultâneas, viu seu pico de adoção nos anos 2010, superando muitos de seus concorrentes. Essa rápida ascensão e mudança no cenário tecnológico pressionaram os proxies reversos tradicionais a evoluir, enfrentando desafios adicionais e complexos apresentados pela era moderna da computação em nuvem com a gigante Amazon Web Services (AWS) iniciando em 2006 a pioneira e em seguida veio a Google Cloud Platform (GCP) em 2008 em 2010 Microsoft Azure.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Apache&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Apache, surgindo nos primórdios da web, é mais do que um simples servidor. Com o mod_proxy, o Apache não apenas roteava o tráfego, mas também proporcionava balanceamento de carga. Esta capacidade inicial formou a base para o desenvolvimento subsequente de API Gateways.&lt;/p&gt;

&lt;p&gt;A Apache Software Foundation, fundada em 1999, tem sido um farol de código aberto, e o servidor Apache é um testemunho disso.&lt;/p&gt;

&lt;p&gt;Grandes empresas como IBM, Nokia e Salesforce usaram Apache em algum momento, evidenciando sua robustez.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Nginx&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Nginx foi uma revolução. Sua arquitetura orientada a eventos permitiu que ele se destacasse em ambientes de alto tráfego.&lt;/p&gt;

&lt;p&gt;Criado por Igor Sysoev em 2002, foi concebido como uma resposta às limitações percebidas no Apache.&lt;/p&gt;

&lt;p&gt;Empresas como Netflix, WordPress e Zappos confiam no Nginx para servir bilhões de solicitações por dia.&lt;/p&gt;

&lt;p&gt;Nginx trouxe um design orientado a eventos, tornando-o mais eficiente em ambientes com alto tráfego. Rápido e leve, ele logo se tornou uma escolha popular para proxy reverso, balanceamento de carga e cache de conteúdo.&lt;/p&gt;

&lt;p&gt;Quando falamos que o Nginx ele é um proxy de "camada 7" ou um "proxy de aplicação", estamos nos referindo à sua capacidade de tomar decisões com base no conteúdo das mensagens HTTP/HTTPS. No entanto, com as capacidades de balanceamento de carga de TCP/UDP, ele também pode operar na camada 4 (camada de transporte).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Envoy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Envoy é um servidor proxy de alto desempenho projetado para aplicações modernas orientadas a serviços, como microserviços. Foi originalmente desenvolvido pela Lyft, e posteriormente foi doado para a Cloud Native Computing Foundation (CNCF). Desde então, tem ganhado considerável tração e tornou-se uma parte central de muitas infraestruturas modernas de TI.&lt;/p&gt;

&lt;p&gt;O Envoy foi introduzido pela primeira vez em 2016 pela Lyft para lidar com seus desafios específicos em escala, relacionados à decomposição de sua monolítica aplicação em microserviços.&lt;/p&gt;

&lt;p&gt;O Envoy e o NGINX são ambos servidores proxy reversos de alto desempenho, e, em muitos cenários, podem ser usados de forma intercambiável. No entanto, eles têm origens e focos um pouco diferentes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Linguagem Go e proxies reversos&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A linguagem Go é conhecida por sua eficiência e capacidade de lidar com concorrência, o que a torna ideal para o desenvolvimento de proxies reversos e servidores web.  Foi criada no Google por Robert Griesemer, Rob Pike e Ken Thompson e foi anunciada ao público em 2009. Desde então, ela ganhou uma adesão considerável no mundo do back-end.&lt;/p&gt;

&lt;p&gt;A Concorrência Nativa em Go é usando goroutines, que são mais leves do que threads tradicionais. Isso permite que os desenvolvedores escrevam programas que lidam eficientemente com muitas tarefas simultâneas, tornando-a ideal para aplicações de rede, como proxies reversos, que podem precisar gerenciar muitas conexões simultâneas.&lt;/p&gt;

&lt;p&gt;O Desempenho em Go é algo fascinante, é uma linguagem compilada, o que significa que o código é transformado diretamente em código de máquina. Isso garante que os programas escritos em Go tenham um desempenho comparável ao de linguagens como C e C++.&lt;/p&gt;

&lt;p&gt;A Simplicidade e Legibilidade usada em Go foi projetada com uma sintaxe clara e um conjunto mínimo de recursos. Isso promove a escrita de código limpo e fácil de entender, facilitando a colaboração e a manutenção.&lt;/p&gt;

&lt;p&gt;As Bibliotecas Padrão em Go são Robustas e muito poderosa, especialmente para tarefas relacionadas à rede e I/O. Isso facilita a construção de servidores web e proxies reversos sem a necessidade de bibliotecas externas.&lt;/p&gt;

&lt;p&gt;A Distribuição Estática dos binários em Go é feita por padrão. Isso significa que, ao compilar um programa, todas as suas dependências são incluídas no binário final. Isso torna a distribuição e a implantação de aplicações Go extremamente simples, sem a necessidade de gerenciar dependências no ambiente de produção.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Aqui estão alguns proxies reversos escritos em Go:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.Caddy&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Além de ser um servidor web, o Caddy é amplamente reconhecido por sua configuração automática de TLS. Lançado em abril de 2015.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.Traefik&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Traefik é um proxy reverso moderno e um load balancer que facilita a implantação de microserviços. Lançado em 2014.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.GoProxy&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;É um proxy reverso simples escrito em Go, que pode ser usado para roteamento e balanceamento de carga. Foi lançado por volta 2013.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.Fabio&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Fabio é um load balancer e proxy reverso rápido que se integra diretamente com o Consul para roteamento dinâmico e lançado em 2015.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camada OSI ou TCP/IP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Proxies podem atuar em diferentes camadas do modelo OSI ou TCP/IP, dependendo da funcionalidade e design específicos da solução. No entanto, a maioria dos proxies reversos modernos, incluindo o NGINX e muitos escritos em Go, são projetados para operar primordialmente nas camadas de Transporte e Aplicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modelo OSI (Open Systems Interconnection):&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Modelo OSI (Open Systems Interconnection) é um framework conceitual usado para compreender as interações de redes complexas. Ele divide as funções de comunicação de rede em sete camadas distintas, cada uma com um conjunto específico de responsabilidades. O propósito desse modelo é guiar os desenvolvedores de produtos e protocolos para que eles possam interoperar com produtos e protocolos de outros fabricantes. Em 1984 o modelo OSI foi formalmente aprovado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modelo TCP/IP&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Modelo TCP/IP, também conhecido como Modelo de Referência da Internet, é um framework mais simples e prático que o OSI, usado para descrever redes de computadores. Ele tem quatro camadas e foi desenvolvido junto com os protocolos que ele descreve, tornando-o extremamente relevante e aplicável ao mundo real da Internet. Em 1983 ARPANET migra oficialmente para o TCP/IP, solidificando sua posição como o conjunto padrão de protocolos para a Internet.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modelo OSI:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camada de Transporte (Layer 4)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Proxies que operam nesta camada são frequentemente chamados de "proxies de camada 4" ou "load balancers de camada 4". Eles tomam decisões de roteamento baseadas principalmente em informações da camada de transporte, como endereços IP de origem e destino e números de portas. Um exemplo é o balanceamento de carga TCP/UDP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camada de Aplicação (Layer 7)&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;O Proxies que operam nesta camada são frequentemente chamados de "proxies de camada 7" ou "load balancers de camada 7". Eles tomam decisões de roteamento baseadas no conteúdo das mensagens na camada de aplicação. Para o tráfego HTTP/HTTPS, isso pode incluir o host, URL, cabeçalhos HTTP e até mesmo o corpo da mensagem. Estes proxies podem inspecionar, modificar e tomar decisões baseadas no conteúdo do tráfego.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Modelo TCP/IP:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camada de Transporte&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O Correspondente à Camada de Transporte no modelo OSI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Camada de Aplicação&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Inclui as funções das camadas de Aplicação, Apresentação e Sessão do modelo OSI. Proxies que operam aqui podem inspecionar e tomar decisões baseadas no conteúdo das mensagens. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Ascensão dos API Gateways&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Essa rápida adoção das APIs levou a novos desafios. À medida que as organizações começavam a oferecer múltiplas APIs, surgiu a necessidade de um sistema centralizado para gerenciar, monitorar e garantir a segurança dessas interfaces. Além disso, com a escalada de microserviços nos anos 2010 e 2020, o tráfego interno entre serviços em ambientes de nuvem também precisava ser eficientemente roteado e gerenciado.&lt;/p&gt;

&lt;p&gt;O termo "API Gateway" tornou-se proeminente principalmente na década de 2010 com a ascensão dos microserviços e da computação em nuvem. Antes disso, as APIs existiam, e as organizações as usavam, mas o conceito de um "gateway" dedicado para gerenciar essas APIs, especialmente em uma arquitetura de microserviços, era menos comum.&lt;/p&gt;

&lt;p&gt;A necessidade de um API Gateway surgiu de vários desafios associados ao desenvolvimento e operação de microserviços, incluindo:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Roteamento e Descoberta de Serviço&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Como direcionar uma chamada de API para o serviço correto em um ambiente onde você tem muitos serviços.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limitação de Taxa&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Proteger os serviços de serem sobrecarregados por demasiadas chamadas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Autenticação e Autorização&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;Verificar quem está fazendo a chamada e o que eles têm permissão para fazer.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Transformação de Requisições e Respostas&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Converter entre diferentes formatos ou versões de API.&lt;/p&gt;

&lt;p&gt;As primeiras soluções de API Gateway começaram a aparecer no mercado por volta de 2010-2012. A ascensão da computação em nuvem e plataformas como a AWS também desempenharam um papel fundamental na popularização do conceito. Por exemplo, em 2015, a AWS lançou o Amazon API Gateway, um serviço totalmente gerenciado para criar, publicar, manter, monitorar e proteger APIs.&lt;/p&gt;

&lt;p&gt;No entanto, é importante notar que, embora o termo "API Gateway" tenha ganhado popularidade durante esse período, o conceito fundamental de intermediar e gerenciar chamadas de API não é novo e tem raízes em tecnologias anteriores, como os Enterprise Service Buses (ESBs) e soluções de integração.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Gateways Kong&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Um dos primeiros e mais notáveis API Gateways de código aberto a ganhar reconhecimento no mercado foi o Kong. Foi lançado em 2015 pela empresa Mashape (agora conhecida como Kong Inc.).&lt;/p&gt;

&lt;p&gt;O Kong foi desenvolvido inicialmente como uma camada em cima do servidor NGINX e utilizou sua capacidade de processamento para lidar com o tráfego de API. Com uma arquitetura modular e suporte a plugins, o Kong ofereceu desde o início uma variedade de funcionalidades como limitação de taxa, autenticação, registro, transformações de solicitações/respostas e muitas outras.&lt;/p&gt;

&lt;p&gt;Seu código aberto e capacidade de extensão rapidamente o tornaram popular entre as comunidades de desenvolvedores e operações, e ele desempenhou um papel significativo na definição do mercado de API Gateway.&lt;/p&gt;

&lt;p&gt;Existiram outros produtos e ferramentas antes do Kong, mas muitos deles eram proprietários ou não eram estritamente API Gateways na definição moderna. O Kong é frequentemente reconhecido por popularizar o conceito e fornecer uma solução robusta e de código aberto para a comunidade.&lt;/p&gt;

&lt;p&gt;O Kong foi desenvolvido principalmente em Lua, utilizando o framework LuaJIT (Just-In-Time Compiler para Lua). Ele é construído em cima do servidor NGINX, aproveitando a capacidade de processamento de alta performance do NGINX com a flexibilidade do Lua através do módulo ngx_http_lua_module, que permite a execução de código Lua dentro do contexto do NGINX. Esse design permite ao Kong ser altamente extensível através de plugins.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Gateways desenvolvidos em Go&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;O KrakenD é uma API Gateway de alto desempenho que ajuda a agregar, transformar e filtrar os dados antes que eles cheguem ao cliente, otimizando assim o consumo de APIs.&lt;/p&gt;

&lt;p&gt;O Gloo é uma API Gateway e proxy reverso baseado no Envoy. É otimizado para casos de uso centrados em microserviços, funções e aplicações em contêiner. Criado pela Solo-io, Gloo é um "Next Generation API Gateway" e ingress controller. Ele foi projetado para ajudar a conectar, proteger e controlar o tráfego de serviços em ambientes de microserviços e aplicativos monolíticos.&lt;/p&gt;

&lt;p&gt;O Tyk é um API Gateway de código aberto e gerenciamento de API que também oferece uma versão comercial. Ele oferece muitos recursos avançados, incluindo quotas, limitação de taxa, e autenticação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;API Gateways CLOUD&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As principais provedoras de nuvem têm suas próprias soluções de API Gateway, otimizadas para integrar-se perfeitamente com seus respectivos ambientes e serviços de nuvem. Tornou-se um grande negócio e a criação de produtos voltados ao gerenciamento e escala quando o assunto é desenvolvimento de APIs. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Amazon Web Services (AWS)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Na AWS usamos API Gateway Este serviço permite que os desenvolvedores criem, publiquem, mantenham, monitorizem e protejam APIs de forma escalável. É capaz de processar milhares de chamadas de API simultaneamente e suporta APIs RESTful e WebSockets. Também se integra facilmente com outros serviços da AWS, como AWS Lambda.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Google Cloud Platform (GCP)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A solução Apigee Adquirida pela Google em 2016, a Apigee oferece uma plataforma de gerenciamento de ciclo de vida completo para APIs, permitindo análises, desenvolvimento de portal de desenvolvedor, e outras características avançadas-Cloud Endpoints: É uma solução mais leve que a Apigee e é mais integrada com o ambiente de nuvem da Google. Permite que os desenvolvedores criem, implantem, protejam e monitorem APIs dentro do GCP.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Microsoft Azure&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A solução Azure API Management: Esta é a solução da Microsoft para o gerenciamento de APIs na nuvem Azure. Ele fornece ferramentas para criar, gerenciar e analisar APIs, e também permite a criação de portais para desenvolvedores e outros recursos avançados.&lt;/p&gt;

&lt;p&gt;Estas soluções diferem em características e capacidades, mas todas têm o objetivo comum de fornecer ferramentas robustas para o gerenciamento, proteção, e análise de APIs em ambientes de nuvem cada um com suas particularidades e características.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Conclusão&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;À medida que adentramos na era da digitalização, a conectividade entre sistemas e aplicações continua a se expandir em complexidade e escala. No centro desta revolução digital, os proxies e API Gateways emergem como componentes críticos para garantir que as comunicações sejam ágeis, seguras e eficientes.&lt;/p&gt;

&lt;p&gt;As soluções modernas de proxies, como o Envoy, e os API Gateways construídos em linguagens de alto desempenho como Go, são peças de uma engrenagem bem maior e que vivenciou toda evolução contínua desta tecnologia. Eles não apenas atendem às necessidades atuais, mas também são projetados com flexibilidade para se adaptarem às mudanças futuras.&lt;/p&gt;

&lt;p&gt;O uso crescente de microserviços, contêineres e soluções de nuvem amplifica ainda mais a necessidade de proxies eficientes e API Gateways robustos. Eles não só permitem a integração eficaz de múltiplos serviços, mas também oferecem segurança, balanceamento de carga, rate limit, transformações de requisições, autenticações e muito mais.&lt;/p&gt;

&lt;p&gt;Enquanto olhamos para o futuro, é evidente que a demanda por proxies e API Gateways só aumentará. Assim, seja você um desenvolvedor, arquiteto ou entusiasta da tecnologia, é fundamental manter-se atualizado sobre estas ferramentas e práticas. Afinal, eles serão os pilares que sustentarão a próxima geração de aplicações e sistemas interconectados.&lt;/p&gt;

</description>
    </item>
    <item>
      <title>GoLang — Simplifying Complexity “The Beginning”</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Fri, 26 May 2023 19:54:43 +0000</pubDate>
      <link>https://forem.com/jeffotoni/golang-simplifying-complexity-the-beginning-i7k</link>
      <guid>https://forem.com/jeffotoni/golang-simplifying-complexity-the-beginning-i7k</guid>
      <description>&lt;p&gt;There are countless programming languages ​​and each one was born with a purpose: “&lt;strong&gt;solve problems&lt;/strong&gt;”. Languages ​​are tools and we will have to know how to use them at the right time. Speaking “&lt;strong&gt;as a developer&lt;/strong&gt;” the more polyglot you can be the better it will be for your professional career and for a better understanding and understanding of the diversity of this ecosystem.&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;goal&lt;/strong&gt; of this post is to introduce what the &lt;strong&gt;Go&lt;/strong&gt; language is and why it is so powerful. Introducing &lt;strong&gt;some concepts and important points about the Go language&lt;/strong&gt; that are often mistakenly expressed in several articles found on the internet and discussion groups of programming languages. I believe that the weaknesses and problems generated by several other programming languages ​​over these decades made &lt;strong&gt;Go&lt;/strong&gt; become what it is today. And to explain how this is possible we will go back to the beginning of everything, where everything began.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello all folks!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Less is exponentially More
&lt;/h1&gt;

&lt;p&gt;The &lt;strong&gt;Go&lt;/strong&gt; development team says that its creation is an attempt to make programmers more productive. Improving the software development process on &lt;em&gt;Google&lt;/em&gt;. The first goal was to create a better language to address the challenges of &lt;em&gt;scalable concurrency&lt;/em&gt;, ie software that handles many concerns simultaneously, an example would be coordinating a thousand &lt;em&gt;back-end&lt;/em&gt; servers sending network traffic all the time.&lt;/p&gt;

&lt;p&gt;Keeping the &lt;strong&gt;Go&lt;/strong&gt; language small allows for more important goals. Being small makes &lt;strong&gt;Go&lt;/strong&gt; easier to &lt;strong&gt;learn&lt;/strong&gt;, easier to &lt;strong&gt;understand&lt;/strong&gt;, easier to &lt;strong&gt;implement&lt;/strong&gt;, easier to &lt;strong&gt;re-implement&lt;/strong&gt;, easier to ** debug**, easier to &lt;strong&gt;tweak&lt;/strong&gt;, and easier to &lt;strong&gt;evolve&lt;/strong&gt;. Doing less allows for more. It's an expression used by the &lt;strong&gt;Go&lt;/strong&gt; development team: “&lt;em&gt;Do Less. Enable More&lt;/em&gt;” would be the balance between the universe of existing problems and what &lt;strong&gt;Go&lt;/strong&gt; can help solve such problems well. &lt;strong&gt;Go&lt;/strong&gt; explicitly wasn't designed to solve every problem instead they've done enough for us to create our own custom solutions with ease, but making it very clear that &lt;strong&gt;Go&lt;/strong&gt; can't do everything.&lt;/p&gt;

&lt;p&gt;Go was designed by &lt;strong&gt;Google&lt;/strong&gt; in &lt;strong&gt;2007&lt;/strong&gt; to improve programming productivity in an era of &lt;strong&gt;multicore,&lt;/strong&gt; network machines and large codebases. The designers wanted to address criticisms of other languages ​​in use at Google, but keep their useful features.&lt;/p&gt;

&lt;p&gt;The creators &lt;a href="https://en.wikipedia.org/wiki/Rob_Pike" rel="noopener noreferrer"&gt;Rob Pike&lt;/a&gt;, &lt;a href="https://en.wikipedia.org/wiki/Ken_Thompson" rel="noopener noreferrer"&gt;Ken Thompson&lt;/a&gt; and [Robert Griesemer](https:/ /de.wikipedia.org/wiki/Robert_Griesemer) kept the syntax of &lt;strong&gt;Go&lt;/strong&gt; similar to &lt;strong&gt;C&lt;/strong&gt;. In late 2008 &lt;a href="https://en.wikipedia.org/wiki/Go_(programming_language)" rel="noopener noreferrer"&gt;Russ Cox&lt;/a&gt; joined the team and helped move the language and libraries from prototype to reality.&lt;/p&gt;

&lt;p&gt;The Go language was released in &lt;strong&gt;2009&lt;/strong&gt; with the purpose of facilitating problem-solving in areas such as network layers, scalability, performance, productivity, and most importantly, concurrency. &lt;a href="https://en.wikipedia.org/wiki/Rob_Pike" rel="noopener noreferrer"&gt;Rob Pike&lt;/a&gt; himself stated that "Go was designed to address a set of software engineering problems we faced when building large server software".&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt; was influenced by various programming languages and different paradigms, including &lt;strong&gt;Alef&lt;/strong&gt;, &lt;strong&gt;APL&lt;/strong&gt;, &lt;strong&gt;BCPL&lt;/strong&gt;, &lt;strong&gt;C&lt;/strong&gt;, &lt;strong&gt;CSP&lt;/strong&gt;, &lt;strong&gt;Limbo&lt;/strong&gt;, &lt;strong&gt;Modula&lt;/strong&gt;, &lt;strong&gt;Newsqueak&lt;/strong&gt;, &lt;strong&gt;Oberon&lt;/strong&gt;, &lt;strong&gt;occam&lt;/strong&gt;, &lt;strong&gt;Pascal&lt;/strong&gt;, &lt;strong&gt;Smalltalk&lt;/strong&gt;, and &lt;strong&gt;Crystal&lt;/strong&gt;. It is evident that they used the best of what they had and created something new and lean, with the minimum necessary to solve the proposed problems without losing its simplicity. I believe this can be called &lt;strong&gt;&lt;em&gt;innovation&lt;/em&gt;&lt;/strong&gt;. &lt;strong&gt;Go&lt;/strong&gt; innovated by breaking the paradigms of programming languages and implementing something new in a simple and very powerful way.&lt;/p&gt;

&lt;h1&gt;
  
  
  Controversies
&lt;/h1&gt;

&lt;p&gt;Several features that are present in other modern programming languages were deliberately left out in Go, going against the trend. These features include immutability declarations, pattern-matching data types, generics, exception handling, inheritance, method overloading, and many other points. All of these features were criticized and pointed out to the creators of Go, who responded: "These omissions were simplifications that contribute to Go's strength." There are many things in the Go language and libraries that differ from modern practices, it was a decision made by the Go development team: "Sometimes it's worth trying a different approach."&lt;/p&gt;

&lt;p&gt;Everyone is invited to help and contribute if they wish, they can submit proposals for new features and anything related to the language's ecosystem. The Go source code is available on GitHub. The documentation on how you can contribute to the language is provided here.&lt;/p&gt;

&lt;h1&gt;
  
  
  Goroutines instead of threads
&lt;/h1&gt;

&lt;p&gt;One of the main goals of the Go programming language is to make concurrency simpler, faster, and more efficient.&lt;/p&gt;

&lt;p&gt;Goroutines are lightweight and take advantage of all available processing power. Goroutines exist only in the Go runtime virtual space and not in the operating system.&lt;/p&gt;

&lt;p&gt;A goroutine is a method/function that can be executed independently along with other goroutines. Each concurrent activity in the Go language is generally called a goroutine.&lt;br&gt;&lt;br&gt;
One of the most relevant and important points is the work with &lt;strong&gt;concurrency&lt;/strong&gt;, which &lt;strong&gt;innovated&lt;/strong&gt; by breaking the &lt;strong&gt;traditional model of&lt;/strong&gt; &lt;a href="https://en.wikipedia.org/wiki/Thread_(computing)" rel="noopener noreferrer"&gt;&lt;strong&gt;threads&lt;/strong&gt;&lt;/a&gt; and its usage by creating a new model, the &lt;a href="https://golang.org/doc/effective_go.html#concurrency" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;goroutines&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;, in &lt;strong&gt;Go&lt;/strong&gt;. &lt;strong&gt;Goroutines&lt;/strong&gt; are responsible for performing &lt;strong&gt;asynchronous&lt;/strong&gt; executions in &lt;strong&gt;Go&lt;/strong&gt;. They are very powerful and a simple machine with &lt;strong&gt;1GB of RAM&lt;/strong&gt; could run thousands of them.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Goroutines&lt;/strong&gt; are part of making &lt;strong&gt;concurrency&lt;/strong&gt; easy to use. &lt;strong&gt;Goroutines&lt;/strong&gt; can be very cheap: they have little overhead beyond memory for the stack, which is only a few kilobytes. To make stacks small, the &lt;strong&gt;Go&lt;/strong&gt; runtime uses resizable and bounded stacks. A newly launched &lt;strong&gt;goroutine&lt;/strong&gt; gets a few kilobytes, which is almost always enough. When it's not, the runtime increases (and shrinks) the memory to store the stack automatically, allowing many &lt;strong&gt;goroutines&lt;/strong&gt; to live in a &lt;strong&gt;modest amount of memory&lt;/strong&gt;. The CPU overhead averages three cheap instructions per function call. It is practical to create &lt;strong&gt;hundreds of thousands of goroutines&lt;/strong&gt; in the same address space. If &lt;strong&gt;goroutines&lt;/strong&gt; were just &lt;strong&gt;threads&lt;/strong&gt;, system resources would run out at a much smaller number.&lt;/p&gt;

&lt;p&gt;The design of &lt;strong&gt;Go&lt;/strong&gt; was heavily influenced by C.A.R. Hoare's &lt;strong&gt;1978&lt;/strong&gt; article "&lt;a href="https://www.cs.cmu.edu/~crary/819-f09/Hoare78.pdf" rel="noopener noreferrer"&gt;Communicating sequential processes&lt;/a&gt;".&lt;/p&gt;
&lt;h1&gt;
  
  
  Simultaneity in CSP Ideas
&lt;/h1&gt;

&lt;p&gt;One of the most successful models for providing high-level language support for concurrency is &lt;strong&gt;&lt;em&gt;Hoare's Communicating Sequential Processes&lt;/em&gt;&lt;/strong&gt; or &lt;a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes" rel="noopener noreferrer"&gt;&lt;strong&gt;CSP&lt;/strong&gt;&lt;/a&gt;. &lt;a href="https://en.wikipedia.org/wiki/Occam_(programming_language)" rel="noopener noreferrer"&gt;&lt;strong&gt;Occam&lt;/strong&gt;&lt;/a&gt; and &lt;a href="https://en.wikipedia.org/wiki/Erlang_(programming_language)" rel="noopener noreferrer"&gt;&lt;strong&gt;Erlang&lt;/strong&gt;&lt;/a&gt; are two well-known languages that derive from &lt;a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes" rel="noopener noreferrer"&gt;&lt;strong&gt;CSP&lt;/strong&gt;&lt;/a&gt;. &lt;strong&gt;Go&lt;/strong&gt;'s concurrency primitives derive from a different part of the genealogical tree whose main contribution is the powerful notion of channels as first-class objects. Experience with several earlier languages showed that the &lt;a href="https://en.wikipedia.org/wiki/Communicating_sequential_processes" rel="noopener noreferrer"&gt;&lt;strong&gt;CSP&lt;/strong&gt;&lt;/a&gt; model fits well into a procedural language framework.&lt;/p&gt;

&lt;p&gt;The biggest difference between Go and the CSP model, besides syntax, is that Go models communication channels explicitly as channels, while the processes of Hoare's language send messages directly to each other, similar to Erlang.&lt;/p&gt;

&lt;p&gt;In order to achieve this result, Go has once again received criticism for the adopted model. Go incorporates a variant of CSP (Communicating Sequential Processes), a formal language for describing interaction patterns in concurrent systems with first-class channels. A single-write approach was not adopted to enhance the semantics in the context of concurrent computing, as is done in Erlang, instead, they adopted something practical that resulted in something powerful, allowing for simple and safe concurrent programming, but does not prevent incorrect programming. And the created motto was: "Do not communicate by sharing memory, share memory by communicating". The simplicity and support for concurrency offered by Go generate robustness.&lt;/p&gt;
&lt;h1&gt;
  
  
  Concurrency is different from Parallelism
&lt;/h1&gt;

&lt;p&gt;One of the famous phrases is: "Concurrency is about dealing with many things at once. Parallelism is doing many things at once." Concurrency is the composition of independent execution calculations. Concurrency is a way of structuring software and is definitely not parallelism, although it allows for parallelism. If you only have one processor, your program can still be concurrent, but it cannot be parallel. On the other hand, a well-written concurrent program can be efficiently executed in parallel on a multiprocessor. I suggest checking out this talk by Rob Pike, "Concurrency is not Parallelism".&lt;/p&gt;

&lt;p&gt;Concurrency in Go is very powerful and also simple to code, which was the intention of the engineers who developed Go. Solving many problems is much more efficient using concurrency, and this is the power of Go, which is why it has become a deity when it comes to concurrency. Therefore, problems encompassed in this universe will be solved very efficiently and, most importantly, with very few computational resources.&lt;/p&gt;

&lt;p&gt;When we talk about &lt;strong&gt;concurrency&lt;/strong&gt;, we need to highlight that there are some &lt;strong&gt;patterns&lt;/strong&gt;, which I describe below, and there are some &lt;strong&gt;types of workloads&lt;/strong&gt; that will serve as our compass to determine our balance point when we have to solve problems involving concurrency.&lt;/p&gt;
&lt;h1&gt;
  
  
  Workloads: CPU-Bound &amp;amp; IO-Bound
&lt;/h1&gt;

&lt;p&gt;A &lt;strong&gt;thread&lt;/strong&gt; can perform &lt;strong&gt;two types of workloads (&lt;em&gt;Workloads&lt;/em&gt;)&lt;/strong&gt;: &lt;strong&gt;CPU-Bound&lt;/strong&gt; and &lt;strong&gt;IO-Bound&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;CPU-Bound&lt;/strong&gt;: This workload will never create a situation where the &lt;strong&gt;thread&lt;/strong&gt; can be put into &lt;strong&gt;&lt;em&gt;waiting states&lt;/em&gt;&lt;/strong&gt;. It will be constantly performing calculations. A &lt;strong&gt;thread&lt;/strong&gt; calculating &lt;em&gt;pi&lt;/em&gt; to the eighteenth power would be limited by the &lt;strong&gt;CPU.&lt;/strong&gt; &lt;em&gt;(Fun fact:&lt;/em&gt; &lt;a href="https://en.wikipedia.org/wiki/Emma_Haruka_Iwao" rel="noopener noreferrer"&gt;&lt;strong&gt;&lt;em&gt;Emma Haruka Iwao&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt; &lt;em&gt;is a Japanese computer scientist and cloud developer engineer at Google. In 2019, Haruka Iwao calculated the most accurate value of pi in the world, which included 31.4 trillion digits).&lt;/em&gt; This type of workload, CPU-bound work, requires parallelism to take advantage of concurrency. More Goroutines will not help and will not be efficient, potentially further delaying the workloads to be executed, due to the latency cost (the time spent) of moving Goroutines in and out of the operating system's thread.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IO-Bound&lt;/strong&gt;: In this type of workload, threads enter waiting states. A good example would be a request for accessing a resource over the network or making calls to the operating system. A thread that needs to access a database, synchronization events &lt;em&gt;(mutex, atomic)&lt;/em&gt;, all of these examples make the thread wait, so we could say they are of the &lt;strong&gt;IO-Bound&lt;/strong&gt; type of workload. In this type of workload, you do not need parallelism to use concurrency, a single physical core would be sufficient for the proper execution of several Goroutines. The Goroutines are entering and exiting waiting states as part of their workload. In this type of workload, having more Goroutines than physical cores can speed up execution because the latency cost of moving Goroutines in and out of the operating system's thread is not creating an event. Its workload is naturally interrupted, allowing a different Goroutine to take advantage of the same physical core instead of allowing it to remain idle.&lt;/p&gt;
&lt;h1&gt;
  
  
  Goroutine and Pattern
&lt;/h1&gt;

&lt;p&gt;There are some patterns for concurrency, among them: &lt;strong&gt;Fan-In&lt;/strong&gt; and &lt;strong&gt;Fan-Out&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fan-Out:&lt;/strong&gt; Multiple functions can read from the same channel until that channel is closed, this is called &lt;strong&gt;&lt;em&gt;fan-out&lt;/em&gt;&lt;/strong&gt;. This provides a way to distribute work among a group of workers to make use of &lt;strong&gt;CPU&lt;/strong&gt; and &lt;strong&gt;I/O&lt;/strong&gt; in a concurrent manner.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.golang.org/pipelines" rel="noopener noreferrer"&gt;&lt;strong&gt;Fan-In&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;:&lt;/strong&gt; It is the way to read from multiple inputs and proceed until all of them are closed, multiplexing the input channels into a single channel that is closed when all the inputs are closed. This is called &lt;strong&gt;&lt;em&gt;fan-in&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pipeline:&lt;/strong&gt; There is no formal definition of a pipeline in Go, it is just one of the many types of concurrent programs. Informally, a pipeline is a series of &lt;em&gt;stages&lt;/em&gt; connected by channels, where each stage is a group of goroutines running the same function. At each stage, the goroutines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Receive values from upstream via input channels;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Perform some function on that data, usually producing new values;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Send values downstream via output channels.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each stage has several input and output channels, except for the first and last stages, which have only input or output channels, respectively.&lt;/p&gt;

&lt;p&gt;To give you an idea, on a &lt;strong&gt;1 CPU and 1 GB RAM&lt;/strong&gt; machine, we can handle &lt;strong&gt;5k to 6k&lt;/strong&gt; requests per second with a simple &lt;strong&gt;Go&lt;/strong&gt; API, with few lines of code, using either &lt;a href="https://en.wikipedia.org/wiki/Remote_procedure_call" rel="noopener noreferrer"&gt;&lt;strong&gt;RPC&lt;/strong&gt;&lt;/a&gt; or native &lt;strong&gt;TCP&lt;/strong&gt; protocols and writing to a relational database like &lt;strong&gt;PostgreSQL&lt;/strong&gt;, without crashing it and consuming an average of only &lt;strong&gt;60Mb to 70Mb&lt;/strong&gt; of memory and 8% to 15% of CPU. To achieve this, we use a "Worker Poll" that is a &lt;a href="https://blog.golang.org/pipelines" rel="noopener noreferrer"&gt;Fan-out&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;If you want to delve further into concurrency, you can check out this &lt;a href="https://github.com/golang/go/wiki/LearnConcurrency" rel="noopener noreferrer"&gt;link&lt;/a&gt;. If you want to test and see some examples, you can &lt;a href="https://github.com/jeffotoni/goexample/tree/master/goroutine" rel="noopener noreferrer"&gt;click here&lt;/a&gt;. We'll create a separate post to talk about &lt;strong&gt;Goroutines&lt;/strong&gt;, which is a very detailed and interesting topic. We know that Go's support for concurrency makes it a godsend for problems that are best solved using concurrency.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt; is a compiled language, a C-like language, very focused on productivity. For simple or complex projects, Go will always be an excellent alternative, as it makes everything simpler and leaner, easy to code and maintain.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, I love Go!&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  There is no silver bullet
&lt;/h1&gt;

&lt;p&gt;There is no solution or tool to solve all problems yet, of course. What we know is that there are countless solutions developed in various languages, each with a purpose and each with its own characteristics. For this reason, there are programming paradigms, which is a way of classifying languages based on their functionalities, making it easier to understand the context in which they will be better inserted, and, of course, giving us a view of their structure and execution of the languages.&lt;/p&gt;

&lt;p&gt;It is becoming increasingly common for languages to support multiple paradigms. We know that there are different classes in computing when it comes to solving problems, and the closer we are to these subjects, the more comfortable we will be to choose a certain language to solve problems, and thus know which tool to use at the right time. In practice, this task is not so easy, but what we know is that the silver bullet has not yet been created to solve all problems at once with just one language, if it existed, there would no longer be &lt;a href="https://en.wikipedia.org/wiki/P_versus_NP" rel="noopener noreferrer"&gt;&lt;strong&gt;P versus NP&lt;/strong&gt;&lt;/a&gt; and all problems could be solved in polynomial time.&lt;/p&gt;

&lt;h1&gt;
  
  
  The Good Things About Go
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;It does not have generics;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It does not have operator overloading;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It does not have pointer arithmetic;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Thread management is not explicitly managed;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It has type inference;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dependencies are clear;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The syntax is clean;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The semantics are clear;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Composition over inheritance;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Native GC (Garbage collector);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It has Goroutines;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Native support for concurrent programming;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;First-class functions (we can pass functions as parameters);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Cross-platform;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open Source;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Very low learning curve, meaning it is easy to learn;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Highly productive;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Solves scalability problems;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It can drastically reduce server costs;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Various problems thought from the Go perspective become much easier to handle and solve;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It has only 25 reserved keywords;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-paradigm: concurrent, functional, imperative, object-oriented;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Memory Safe.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We know that various points above will be criticized, but in practice and over time, we realized that all the omitted simplifications made Go an even more powerful language.&lt;/p&gt;

&lt;h1&gt;
  
  
  When we didn't have Generics
&lt;/h1&gt;

&lt;p&gt;When we didn't have Generics There are strong reasons why Go didn't implement Generics early in the project, and there's a discussion in the general communities about this topic. Go left out several features, including “Generics”, which in its conception would directly compromise the performance and purpose that the Go language was intended to solve.&lt;/p&gt;

&lt;p&gt;Complainants are mainly developers who come from languages that use this feature. On November 29, 2018, the Go source code maintainers opened up the possibility to submit proposals for new features with all the details so that they can analyze them and possibly implement them in the Go 2.0 version, but we know that this happened before in March 2022 version 1.18 was released. To get a good idea, read this file by &lt;a href="https://blog.golang.org/go2-here-we-come" rel="noopener noreferrer"&gt;by clicking here.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;In Go 1.18, the language introduced a new feature called generic types that had been on the wish list of Go developers for some time. In programming, a generic type is a type that can be used in conjunction with many other types. Normally in Go, if you want to use two different types for the same variable, you need to use a specific interface, like io.Reader, or use interface{}, which allows you to use any value. Using the {} interface can make working with these types difficult because you have to translate between several other possible types to interact with them. Using generic types allows you to interact directly with your types, leading to cleaner, easier-to-read code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Example:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Imagine a method that receives an array of type int and prints it on the screen.&lt;br&gt;&lt;br&gt;
Imagine now needing to do the same with the String type and the float type, you would have to create new methods or functions several times, repeating the code.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;: To avoid creating several methods, only one method is created as a generic to be able to receive any type.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;iMyinterface&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;int64&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kt"&gt;int32&lt;/span&gt;
    &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="kt"&gt;float64&lt;/span&gt;
    &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="err"&gt;~&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;byte&lt;/span&gt;
    &lt;span class="n"&gt;MyMethod&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NoGenericFuncStrs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NoGenericFuncInts&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;NoGenericInterface&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;GenericsFuncStrs&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;comparable&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="kt"&gt;bool&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Note that this is only a problem in languages that need to declare types of variables or functions, etc. In dynamic languages like PHP, for example, this is not necessary. I won't say strongly or weakly typed languages because it's a bit more complex than that, and that would lead to another discussion.&lt;/p&gt;

&lt;p&gt;In Go, we can solve all problems of this nature using reflect and other interfaces and now we have Generics to make our work even easier 😎.&lt;/p&gt;

&lt;p&gt;Below are three examples with three proposals to solve the problem in this way, and you will be able to understand when we talk about Generics. 😊&lt;/p&gt;

&lt;h2&gt;
  
  
  Copying and Pasting Functions with Specific Types
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="c"&gt;// Takes a slice of any type and reverses it.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Reverses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c"&gt;// Takes a slice of any type and reverses it.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Reversei&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"otoni"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"jeff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"Go"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;Reverses&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2009&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="n"&gt;Reversei&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; 
    &lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using Interface
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="c"&gt;// Takes a slice of any type and reverses it.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{})&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;switch&lt;/span&gt; &lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
               &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
           &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
           &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;

         &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;in&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;([]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
           &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
           &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
           &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
            &lt;span class="p"&gt;}&lt;/span&gt;
            &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="no"&gt;nil&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"otoni"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"jeff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s"&gt;"Go"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="m"&gt;2009&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;  
    &lt;span class="n"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  
    &lt;span class="nb"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Using Generics
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;// https://go2goplay.golang.org/&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c"&gt;// The playground now supports parentheses or square brackets (only one at&lt;/span&gt;
&lt;span class="c"&gt;// a time) for generic type and function declarations and instantiations.&lt;/span&gt;
&lt;span class="c"&gt;// By default, parentheses are expected. To switch to square brackets,&lt;/span&gt;
&lt;span class="c"&gt;// the first generic declaration in the source must use square brackets.&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; &lt;span class="n"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;
        &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;--&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="k"&gt;interface&lt;/span&gt;&lt;span class="p"&gt;{}&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"jeffotoni"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;" ano de 2020 "&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"otoni"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"jeff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Go"&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2009&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;
        &lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s"&gt;"otoni"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"jeff"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Go"&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;intt&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="m"&gt;2020&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2012&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;2009&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;Reverse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;Print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intt&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Composition over Inheritance
&lt;/h1&gt;

&lt;p&gt;The approach adopted by Go departs from the norm and is unusual for object-oriented programming, allowing methods of any type, not just classes, but without any form of type-based inheritance, such as subclasses. This means that there is no type hierarchy. This is not a bug, not a disadvantage, nor an error, but an intentional design choice by the developers of Go. Although type hierarchies have been used to build successful software, it is the stance and opinion of the Go development team, that they preferred to take a step back instead of doing the same repetitive model in various languages.&lt;/p&gt;

&lt;h2&gt;
  
  
  Interfaces are implicit
&lt;/h2&gt;

&lt;p&gt;Instead, Go has interfaces, which are just a set of methods and nothing more.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Example:&lt;/em&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Geometric&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;
  &lt;span class="n"&gt;perim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;All data types that implement these methods satisfy this interface implicitly, there is no "implements" in the declaration. Interface satisfaction is checked statically at compile time, therefore, despite the decoupling interfaces, they are type-safe.&lt;/p&gt;

&lt;p&gt;A type usually satisfies many interfaces, each corresponding to a subset of its methods. This fluidity of interface satisfaction encourages a different approach to software construction, breaking the existing paradigm.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why aren't interfaces explicit?
&lt;/h2&gt;

&lt;p&gt;Object-oriented programming provides a powerful view: that the &lt;em&gt;behavior&lt;/em&gt; of data can be generalized independently of the &lt;em&gt;representation&lt;/em&gt; of that data. The model works best when a behavior (set of methods) is fixed, but once you insert a subclass into a type and add a method, &lt;em&gt;the behaviors are no longer identical&lt;/em&gt;. If instead, the set of behaviors is fixed, as in interfaces statically defined in Go, the uniformity of behavior allows data and programs to be composed uniformly, orthogonally, and safely. Type hierarchies result in fragile code. Go stimulates composition and not inheritance, using simple interfaces, usually of one method, to define trivial behaviors that serve as clear and understandable boundaries between components and eliminating the type hierarchy also eliminates one form of dependency hierarchy. The designs are not like hierarchical methods &lt;strong&gt;inherited from subtypes&lt;/strong&gt;. They are more &lt;strong&gt;loose, organic, decoupled, independent&lt;/strong&gt; and therefore &lt;strong&gt;scalable&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"math"&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;Geometric&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;
    &lt;span class="n"&gt;perim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;rect&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;circle&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;perim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;height&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;perim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;float64&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pi&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="n"&gt;geometry&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;area&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;g&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;perim&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;rect&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;width&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;height&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;circle&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;radius&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;measure&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  &lt;strong&gt;Duck typing&lt;/strong&gt;
&lt;/h1&gt;

&lt;p&gt;Go supports &lt;strong&gt;"Duck typing",&lt;/strong&gt; a typing style in which the &lt;em&gt;methods&lt;/em&gt; and &lt;em&gt;properties&lt;/em&gt; of an object determine the valid semantics, rather than its inheritance from a particular class or implementation of an explicit interface. The concept's name refers to the &lt;a href="https://en.wikipedia.org/wiki/Duck_test" rel="noopener noreferrer"&gt;duck test&lt;/a&gt;, attributed to &lt;a href="https://en.wikipedia.org/w/index.php?title=James_Whitcomb_Riley&amp;amp;action=edit&amp;amp;redlink=1" rel="noopener noreferrer"&gt;James Whitcomb Riley&lt;/a&gt;. This makes Go look like a dynamic language.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Go_(programming_language)" rel="noopener noreferrer"&gt;Go&lt;/a&gt; uses &lt;strong&gt;"Structural Typing"&lt;/strong&gt; in methods to determine the compatibility of a type with an interface. There are no type hierarchies, and &lt;strong&gt;"Structural Typing"&lt;/strong&gt; is an interesting alternative to classic inheritance in statically typed languages. It allows you to write generic algorithms without obscuring the definition of a type in a sea of interfaces. Perhaps more importantly, it helps statically typed languages capture the feel and productivity of dynamically typed languages.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;"Duck typing"&lt;/strong&gt; occurs at runtime and &lt;strong&gt;"Structural Typing"&lt;/strong&gt; occurs at compile time. Go does not support object orientation as implemented in languages like C#, Java, or even C++, it has no inheritance and honestly, I am very happy with this, but it does offer some features such as &lt;strong&gt;&lt;em&gt;composition and interfaces&lt;/em&gt;&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;go&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;





&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;family&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;pai&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;Nome&lt;/span&gt;  &lt;span class="kt"&gt;string&lt;/span&gt;
    &lt;span class="n"&gt;Idade&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;
    &lt;span class="n"&gt;Cpf&lt;/span&gt;   &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"campo-x"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="n"&gt;pai&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome: %s, Idade: %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;type&lt;/span&gt; &lt;span class="n"&gt;filho&lt;/span&gt; &lt;span class="k"&gt;struct&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pai&lt;/span&gt;
    &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="n"&gt;filho&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sprintf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Nome: %s, Idade: %d, Email: %s"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;mostraDados&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;membro&lt;/span&gt; &lt;span class="n"&gt;familia&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;membro&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dados&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;pai&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pai&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;pai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Jeff"&lt;/span&gt;
    &lt;span class="n"&gt;pai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;50&lt;/span&gt;
    &lt;span class="n"&gt;pai&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Cpf&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"00.xxx.xxx-xx"&lt;/span&gt;

    &lt;span class="n"&gt;filho&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filho&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;filho&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Arthur"&lt;/span&gt;
    &lt;span class="n"&gt;filho&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="m"&gt;20&lt;/span&gt;
    &lt;span class="n"&gt;filho&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"arthur@gmail.com"&lt;/span&gt;

    &lt;span class="n"&gt;mostraDados&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pai&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;mostraDados&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filho&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Strong third-party library support
&lt;/h1&gt;

&lt;p&gt;In the current scenario, &lt;strong&gt;Go&lt;/strong&gt; has taken off as a programming language and all major, medium, and small existing players are developing their libraries, SDKs, clients, etc. in the &lt;strong&gt;Go&lt;/strong&gt; language. There are thousands of initiatives and many third-party libraries. Everything contributes to this, the &lt;strong&gt;Go&lt;/strong&gt; community is very strong, it grows every day, it has a very high acceptance curve, and with this, it facilitates its entry into companies and its use by developers.&lt;/p&gt;

&lt;p&gt;The result of this is mass dissemination on the internet with libraries written in &lt;strong&gt;Go&lt;/strong&gt;. There are also libraries that are abandoned, as in any other language, but functional. But the number of libraries written in &lt;strong&gt;Go&lt;/strong&gt; is very, very large. Several companies are rewriting their platforms in &lt;strong&gt;Go&lt;/strong&gt;, which is a trend that continues to grow. And day by day the number of tools for &lt;a href="https://www.redhat.com/pt-br/topics/devops" rel="noopener noreferrer"&gt;&lt;strong&gt;DevOps&lt;/strong&gt;&lt;/a&gt; grows, and with this, the acceptance and increase of new adherents to Go grows in the &lt;a href="https://en.wikipedia.org/wiki/DevOps" rel="noopener noreferrer"&gt;&lt;strong&gt;DevOps&lt;/strong&gt;&lt;/a&gt; culture and community.&lt;/p&gt;

&lt;p&gt;After the implementation of version control &lt;strong&gt;VGO&lt;/strong&gt; in &lt;strong&gt;Go&lt;/strong&gt;, we now have the possibility of not needing our projects to be under $GOPATH, we can now create our projects in any directory outside $GOPATH. This feature is only possible due to version control, when we use &lt;strong&gt;&lt;em&gt;"go mod"&lt;/em&gt;&lt;/strong&gt; our project workspaces are controlled in a new way, just run the command &lt;em&gt;"go mod init yourapp"&lt;/em&gt; and a file named &lt;strong&gt;&lt;em&gt;"go.mod"&lt;/em&gt;&lt;/strong&gt; will be created containing the location of your path and the version in which it is located. Very simple and beautiful. Every time we run our Go project, we can use the environment variable &lt;em&gt;"GO111MODULE=yes|no"&lt;/em&gt; to determine whether we will use "go mod" or not.&lt;/p&gt;

&lt;h1&gt;
  
  
  Garbage collector (GC)
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;GCs&lt;/strong&gt; are complex pieces of software, decades of research and implementations, and various attempts by computer scientists to make an improved and reliable GC. It is not a simple task, and due to this, there is a huge chain on the internet describing the pros and cons of a GC. What we have to take into consideration is that regardless of the result, if we didn't have a GC, we would have to build one to solve the allocation problem.&lt;/p&gt;

&lt;p&gt;There are usually two ways to allocate memory in &lt;strong&gt;Go&lt;/strong&gt;: on the stack and on the heap. Generally, developers are familiar with the stack, just write a recursive program and you will notice a &lt;a href="https://stackoverflow.com/questions/26158/how-does-a-stack-overflow-occur-and-how-do-you-prevent-it" rel="noopener noreferrer"&gt;stack overflow&lt;/a&gt; if you don't do it correctly. The heap, on the other hand, is a pool of memory that can be used for dynamic allocation.&lt;/p&gt;

&lt;p&gt;Stack allocations are great because they only live during the lifetime of the function to which they belong. Heap allocations, however, will not be deallocated automatically when they go out of scope. To avoid the heap becoming dissociated, we must deallocate it explicitly or, in the case of memory-managed programming languages (like Go), rely on the garbage collector to locate and delete unreferenced objects.&lt;/p&gt;

&lt;p&gt;In general, in languages with a &lt;strong&gt;GC&lt;/strong&gt;, the more you can store on the stack, the better, since these allocations are never seen by the &lt;strong&gt;GC&lt;/strong&gt;. Compilers use a technique called &lt;em&gt;escape analysis&lt;/em&gt; to determine whether something can be allocated on the stack or should be placed on the heap.&lt;/p&gt;

&lt;p&gt;In practice, writing programs that force the compiler to allocate only on the stack can be very limiting, and thus, in Go, we take advantage of its wonderful GC to do the work of keeping our heap clean.&lt;/p&gt;

&lt;p&gt;If you want to take a look and delve deeper into the subject, check out this link written by Richard L. Hudson: &lt;a href="https://blog.golang.org/ismmkeynote" rel="noopener noreferrer"&gt;https://blog.golang.org/ismmkeynote&lt;/a&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Some types of applications implemented in Go
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;Go&lt;/strong&gt; is a general-purpose language. &lt;a href="https://github.com/nouney/awesome-go" rel="noopener noreferrer"&gt;In this link&lt;/a&gt;, you can see various applications implemented in &lt;strong&gt;Go&lt;/strong&gt; and their respective categories.&lt;/p&gt;

&lt;h2&gt;
  
  
  Some types:
&lt;/h2&gt;

&lt;p&gt;. Web backend &lt;em&gt;(with&lt;/em&gt; &lt;a href="https://github.com/nouney/awesome-go#web-frameworks" rel="noopener noreferrer"&gt;&lt;em&gt;various frameworks&lt;/em&gt;&lt;/a&gt; &lt;em&gt;available)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
. Web Assembly (&lt;a href="https://github.com/vugu/vugu" rel="noopener noreferrer"&gt;&lt;em&gt;one of them is vugu framework&lt;/em&gt;&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
. Microservices (&lt;em&gt;some frameworks:&lt;/em&gt; &lt;a href="https://micro.mu/" rel="noopener noreferrer"&gt;&lt;em&gt;Go Micro&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://gokit.io/" rel="noopener noreferrer"&gt;&lt;em&gt;Go Kit&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://github.com/NYTimes/gizmo" rel="noopener noreferrer"&gt;&lt;em&gt;Gizmo&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://github.com/koding/kite" rel="noopener noreferrer"&gt;&lt;em&gt;Kite&lt;/em&gt;&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
. Fragments services (&lt;em&gt;Term mentioned by &lt;a class="mentioned-user" href="https://dev.to/jeffotoni"&gt;@jeffotoni&lt;/a&gt; in a microservices discussion group&lt;/em&gt;)&lt;br&gt;&lt;br&gt;
. Lambdas (&lt;em&gt;FaaS&lt;/em&gt; &lt;a href="https://www.alexedwards.net/blog/serverless-api-with-go-and-aws-lambda" rel="noopener noreferrer"&gt;&lt;em&gt;example&lt;/em&gt;&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
. Client Server&lt;br&gt;&lt;br&gt;
. Terminal applications (&lt;a href="https://github.com/rivo/tview" rel="noopener noreferrer"&gt;using the tview lib&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
. IoT (&lt;a href="https://github.com/nouney/awesome-go#iot-internet-of-things" rel="noopener noreferrer"&gt;&lt;em&gt;some frameworks&lt;/em&gt;&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
. Bots (&lt;a href="https://github.com/nouney/awesome-go#bot-building" rel="noopener noreferrer"&gt;&lt;em&gt;some here&lt;/em&gt;&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
. Client Applications using Web technology&lt;br&gt;&lt;br&gt;
. Desktop using Qt+QML, Native Win Lib (&lt;a href="https://github.com/therecipe/qt" rel="noopener noreferrer"&gt;&lt;em&gt;example Qt&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://therecipe.github.io/widgets_playground/" rel="noopener noreferrer"&gt;&lt;em&gt;Qt widgets&lt;/em&gt;&lt;/a&gt;&lt;em&gt;,&lt;/em&gt; &lt;a href="https://doc.qt.io/qt-5/qtqml-index.html" rel="noopener noreferrer"&gt;&lt;em&gt;Qml&lt;/em&gt;&lt;/a&gt;)&lt;br&gt;&lt;br&gt;
. Network Applications&lt;br&gt;&lt;br&gt;
. Protocol applications&lt;br&gt;&lt;br&gt;
. &lt;a href="https://en.wikipedia.org/wiki/Representational_state_transfer" rel="noopener noreferrer"&gt;REST&lt;/a&gt; Applications&lt;br&gt;&lt;br&gt;
. &lt;a href="https://en.wikipedia.org/wiki/SOAP" rel="noopener noreferrer"&gt;SOAP&lt;/a&gt; Applications&lt;br&gt;&lt;br&gt;
. &lt;a href="https://en.wikipedia.org/wiki/GraphQL" rel="noopener noreferrer"&gt;GraphQL&lt;/a&gt; Applications&lt;br&gt;&lt;br&gt;
. &lt;a href="https://en.wikipedia.org/wiki/Remote_procedure_call" rel="noopener noreferrer"&gt;RPC&lt;/a&gt; Applications&lt;br&gt;&lt;br&gt;
. &lt;a href="https://en.wikipedia.org/wiki/Transmission_Control_Protocol" rel="noopener noreferrer"&gt;TCP&lt;/a&gt; Applications&lt;br&gt;&lt;br&gt;
. &lt;a href="https://en.wikipedia.org/wiki/GRPC" rel="noopener noreferrer"&gt;gRPC&lt;/a&gt; Applications&lt;br&gt;&lt;br&gt;
. &lt;a href="https://en.wikipedia.org/wiki/WebSocket" rel="noopener noreferrer"&gt;WebSocket&lt;/a&gt; Applications&lt;br&gt;&lt;br&gt;
. GopherJS (&lt;a href="https://github.com/gopherjs" rel="noopener noreferrer"&gt;&lt;em&gt;compiles Go to JavaScript&lt;/em&gt;&lt;/a&gt;)&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Why We Love Go! ❤</title>
      <dc:creator>Jefferson Otoni Lima</dc:creator>
      <pubDate>Wed, 26 Apr 2023 18:03:13 +0000</pubDate>
      <link>https://forem.com/jeffotoni/why-we-love-go-52ck</link>
      <guid>https://forem.com/jeffotoni/why-we-love-go-52ck</guid>
      <description>&lt;p&gt;Go: The fastest growing language for backend&lt;/p&gt;

&lt;p&gt;Go was designed by Google in 2007 to improve programming productivity in an era of multicore, networked machines, and large codebases. The designers wanted to address criticisms of other languages in use at Google, but keep their useful features. The creators Rob Pike, Ken Thompson, and Robert Griesemer kept Go's syntax similar to C. In late 2008, Russ Cox joined the team and helped move the language and libraries from prototype to reality.&lt;/p&gt;

&lt;p&gt;The Go language was released in 2009 with the purpose of making it easier to solve problems related to networked layers, scalability, performance, productivity, and most importantly, concurrency. Rob Pike himself declared that "Go was designed to address a set of engineering problems we encountered building large server software."&lt;/p&gt;

&lt;p&gt;Go has been influenced by various programming languages and different paradigms, including Alef, APL, BCPL, C, CSP, Limbo, Modula, Newsqueak, Oberon, occam, Pascal, Smalltalk, and Crystal. It is clear that they used what was best and created something new and lean, with the minimum necessary to solve the proposed problems without losing its simplicity. I believe this is what we can call innovation. Go broke the paradigms of languages and implemented something new in a simple and very powerful way.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;mainimport&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello all folks!"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Less is exponentially more
&lt;/h1&gt;

&lt;p&gt;The Go developer team say its creation is an attempt to make programmers more productive. Improving the software development process on &lt;em&gt;Google&lt;/em&gt;. The first goal was to create a better language to address the challenges of &lt;em&gt;scalable concurrency&lt;/em&gt;, ie software that handles many concerns simultaneously, an example would be coordinating a thousand &lt;em&gt;back-end&lt;/em&gt; servers sending network traffic all the time.&lt;/p&gt;

&lt;p&gt;Keeping the Go language small allows for more important goals. Being small makes Go easier to learn, easier to understand, easier to implement, easier to reimplement, easier to debug, easier to tweak, and easier to evolve. Doing less allows for more. It's an expression used by the Go development team: “&lt;em&gt;Do Less. Enable More&lt;/em&gt;” would be the balance between the universe of existing problems and what Go can help to solve such problems well. Go explicitly wasn't designed to solve every problem, instead they've done enough for us to create our own custom solutions with ease, while making it very clear that Go can't do everything.&lt;/p&gt;

&lt;h1&gt;
  
  
  Uproar in the Go community
&lt;/h1&gt;

&lt;p&gt;Several features of modern languages were left out, contradicting and going in the opposite direction of other current languages, some features such as: the use of immutability declarations, pattern matching data types, generics, exception handling, inheritance, generic programming, assertion, and method overloading, and many other points. All of the above resources were criticized and pointed out to the creators of Go, who responded: "These omissions were simplifications that contributed and contribute to the strength of Go." There are many things in the Go language and libraries that differ from modern practices, and it was a decision of the Go development team: "Sometimes it's worth trying a different approach."&lt;/p&gt;

&lt;p&gt;Everyone is invited to help and contribute if they wish. Interested parties can open proposals for new features and everything related to the language ecosystem. The Go source code is available on GitHub. The documentation on how you can contribute to the language is provided here.&lt;/p&gt;

&lt;h1&gt;
  
  
  Concurrency is different from parallelism
&lt;/h1&gt;

&lt;p&gt;One of the famous phrases is: *“Competition is about dealing with many things at the same time. Parallelism is doing many things at the same time”.*Concurrency is the composition of independently executing calculations. Concurrency is a way of structuring software, and it is definitely not parallelism although it does allow for parallelism.&lt;/p&gt;

&lt;p&gt;If you only have one processor, your program can still be concurrent, but not parallel. On the other hand, a well-written concurrent program can run efficiently in parallel on a multiprocessor. I suggest checking out this video of a talk by &lt;a href="https://pt.wikipedia.org/wiki/Rob_Pike" rel="noopener noreferrer"&gt;Rob Pike&lt;/a&gt; “&lt;a href="https://vimeo.com/49718712" rel="noopener noreferrer"&gt;Concurrency is not Parallelism&lt;/a&gt;”.&lt;/p&gt;

&lt;p&gt;Concurrency in Go is very powerful and also simple to code, which was the intent of the engineers who developed Go. Solving many problems is much more efficient using concurrency and this is the power of Go, so it has become a god when it comes to concurrency. Due to this, problems encompassed in this universe will be solved very efficiently and most importantly, with very little computational resources.&lt;/p&gt;

&lt;p&gt;The example below is a classic one when referring to concurrency, when we want to balance CPU and I/O we use this parttern &lt;strong&gt;Fan-out&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  What is Fan-out ?
&lt;/h2&gt;

&lt;p&gt;Multiple functions can read from the same channel until that channel is closed, this is called &lt;strong&gt;&lt;em&gt;fan-out&lt;/em&gt;&lt;/strong&gt; . This provides a way to distribute work among a group of workers to parallelize &lt;strong&gt;CPU&lt;/strong&gt; and &lt;strong&gt;I/O&lt;/strong&gt; usage.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="c"&gt;/*
* Example Worker
* @package     main
* @author      @jeffotoni
 */&lt;/span&gt;

&lt;span class="c"&gt;// In this example we'll look at how to implement&lt;/span&gt;
&lt;span class="c"&gt;// a _worker pool_ using goroutines and channels.&lt;/span&gt;
&lt;span class="k"&gt;package&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;

&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"fmt"&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="s"&gt;"time"&lt;/span&gt;

&lt;span class="c"&gt;// Here's the worker, of which we'll run several&lt;/span&gt;
&lt;span class="c"&gt;// concurrent instances. These workers will receive&lt;/span&gt;
&lt;span class="c"&gt;// work on the `jobs` channel and send the corresponding&lt;/span&gt;
&lt;span class="c"&gt;// results on `results`. We'll sleep a second per job to&lt;/span&gt;
&lt;span class="c"&gt;// simulate an expensive task.&lt;/span&gt;
&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="k"&gt;chan&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="k"&gt;range&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"worker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"started  job"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Sleep&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Second&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

        &lt;span class="n"&gt;fmt&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"worker"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"finished job"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="m"&gt;2&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;

    &lt;span class="c"&gt;// In order to use our pool of workers we need to send&lt;/span&gt;
    &lt;span class="c"&gt;// them work and collect their results. We make 2&lt;/span&gt;
    &lt;span class="c"&gt;// channels for this.&lt;/span&gt;
    &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;results&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="nb"&gt;make&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;chan&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;100&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// This starts up 3 workers, initially blocked&lt;/span&gt;
    &lt;span class="c"&gt;// because there are no jobs yet.&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;go&lt;/span&gt; &lt;span class="n"&gt;worker&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c"&gt;// Here we send 5 `jobs` and then `close` that&lt;/span&gt;
    &lt;span class="c"&gt;// channel to indicate that's all the work we have.&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="n"&gt;jobs&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt; &lt;span class="n"&gt;j&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="nb"&gt;close&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;jobs&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="c"&gt;// Finally we collect all the results of the work.&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="m"&gt;5&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;-&lt;/span&gt;&lt;span class="n"&gt;results&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Good points of Go:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Does not have Generics;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does not have operator overload;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Does not have pointer arithmetic;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Threads management is not explicit;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Has type inference;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dependencies are clear;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The syntax is clean;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;The semantics are clear;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Composition and not inheritance;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Native GC (Garbage collector);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Has Goroutines;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Native support for concurrent programming;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;First Class Functions (&lt;em&gt;we can pass functions as parameters&lt;/em&gt;);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multiplataform;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Open Source;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Very low Learning Curve or easy to learn;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Highly productive;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Resolves scalability issues;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It can lowers your server costs drastically;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Several problems thought from the Go perspective become much easier to treat and solve them;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;It has only 25 reserved words;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Multi-paradigm: concurrent, functional, imperative, object-oriented;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;MemorySafe.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We know that several points above will be &lt;em&gt;criticized&lt;/em&gt;, but in practice and over time we realized that all the omitted simplifications made Go an even more powerful language. For simple or complex projects, Go will always be an excellent alternative, as it makes everything simpler and leaner, easier to code and maintain.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;Go is love&lt;/em&gt;&lt;/strong&gt; ❤&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
