<?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>DEV Community: Ahmed Raza Idrisi</title>
    <description>The latest articles on DEV Community by Ahmed Raza Idrisi (@ahmedraza_fyntune).</description>
    <link>https://dev.to/ahmedraza_fyntune</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.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F2533524%2F63d54c29-49fc-4cf7-8a18-18a098084828.png</url>
      <title>DEV Community: Ahmed Raza Idrisi</title>
      <link>https://dev.to/ahmedraza_fyntune</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ahmedraza_fyntune"/>
    <language>en</language>
    <item>
      <title># 🔬 PostgreSQL Internals: What Is Actually Inside an 8 KB Page?</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Sat, 08 Aug 2026 08:01:33 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/-postgresql-internals-what-is-actually-inside-an-8-kb-page-3cfg</link>
      <guid>https://dev.to/ahmedraza_fyntune/-postgresql-internals-what-is-actually-inside-an-8-kb-page-3cfg</guid>
      <description>&lt;p&gt;In my previous post, I looked at what happens when PostgreSQL executes a &lt;code&gt;SELECT&lt;/code&gt; query.&lt;/p&gt;

&lt;p&gt;One part of that journey caught my attention:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;PostgreSQL doesn't simply read "rows" from disk. It works with &lt;strong&gt;pages&lt;/strong&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;So I wanted to go one level deeper.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What is actually inside a PostgreSQL page?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Today, we're going to inspect one.&lt;/p&gt;

&lt;p&gt;Not just with a diagram.&lt;/p&gt;

&lt;p&gt;We'll use PostgreSQL itself to look inside its storage.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 First: What Is a PostgreSQL Page?
&lt;/h2&gt;

&lt;p&gt;PostgreSQL stores table and index data in fixed-size blocks called &lt;strong&gt;pages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In a standard PostgreSQL build, a page is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8 KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So instead of imagining a table like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;users

Row 1
Row 2
Row 3
Row 4
Row 5
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Think about it more like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;users table

┌──────────────────┐
│ Page 0 - 8 KB    │
├──────────────────┤
│ Page 1 - 8 KB    │
├──────────────────┤
│ Page 2 - 8 KB    │
├──────────────────┤
│ Page 3 - 8 KB    │
└──────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each page can contain multiple tuples (PostgreSQL's internal term for stored row versions).&lt;/p&gt;




&lt;h1&gt;
  
  
  🔍 Why Does PostgreSQL Use Pages?
&lt;/h1&gt;

&lt;p&gt;Imagine PostgreSQL had to read every individual row directly from disk.&lt;/p&gt;

&lt;p&gt;That would create a huge amount of I/O.&lt;/p&gt;

&lt;p&gt;Instead, PostgreSQL works with blocks of data.&lt;/p&gt;

&lt;p&gt;If it needs a particular piece of data, it can bring the relevant page into memory.&lt;/p&gt;

&lt;p&gt;A simplified view is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Disk
 │
 │ 8 KB page
 ▼
PostgreSQL Buffer
 │
 ▼
Executor
 │
 ▼
Tuple
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is one reason database performance is heavily influenced by &lt;strong&gt;I/O&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧱 What's Inside a Page?
&lt;/h2&gt;

&lt;p&gt;A simplified PostgreSQL heap page looks something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌──────────────────────────────┐
│        Page Header           │
├──────────────────────────────┤
│        Line Pointers         │
│                              │
│                              │
│        Free Space            │
│                              │
│                              │
│        Tuples / Rows         │
└──────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There are several important pieces here.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Page Header
&lt;/h2&gt;

&lt;p&gt;Every page has a header containing metadata about the page.&lt;/p&gt;

&lt;p&gt;Among other things, PostgreSQL tracks information such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;page state&lt;/li&gt;
&lt;li&gt;free space boundaries&lt;/li&gt;
&lt;li&gt;LSN-related information&lt;/li&gt;
&lt;li&gt;checksum-related information when enabled&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The important idea is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;The page needs metadata so PostgreSQL knows how to manage the data inside it.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  2️⃣ Line Pointers
&lt;/h2&gt;

&lt;p&gt;This is one of the most interesting parts.&lt;/p&gt;

&lt;p&gt;PostgreSQL doesn't simply say:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Row 1 starts at byte 100
Row 2 starts at byte 250
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead, the page contains &lt;strong&gt;line pointers&lt;/strong&gt; (also called item identifiers).&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Line Pointer 1 → Tuple 1
Line Pointer 2 → Tuple 2
Line Pointer 3 → Tuple 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This becomes particularly important when PostgreSQL updates rows.&lt;/p&gt;

&lt;p&gt;We'll come back to this when we discuss MVCC.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Free Space
&lt;/h2&gt;

&lt;p&gt;A page needs somewhere to put new tuples.&lt;/p&gt;

&lt;p&gt;So there is free space between the line-pointer area and tuple storage.&lt;/p&gt;

&lt;p&gt;Conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;┌─────────────────────┐
│ Page Header         │
├─────────────────────┤
│ Line Pointers       │
├─────────────────────┤
│                     │
│     Free Space      │
│                     │
├─────────────────────┤
│ Tuple 3             │
│ Tuple 2             │
│ Tuple 1             │
└─────────────────────┘
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact physical layout is more nuanced, but this mental model is useful.&lt;/p&gt;




&lt;h1&gt;
  
  
  4️⃣ Tuples
&lt;/h1&gt;

&lt;p&gt;Finally, we have the actual stored row versions.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insert some data:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Ahmed'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Sarah'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Mike'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These rows eventually occupy storage inside heap pages.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧪 Let's Inspect One
&lt;/h2&gt;

&lt;p&gt;Now let's get our hands dirty.&lt;/p&gt;

&lt;p&gt;PostgreSQL provides an extension called:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pageinspect
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;It provides functions for inspecting the internal contents of database pages.&lt;/p&gt;

&lt;p&gt;⚠️ This is primarily a learning/debugging tool. You generally don't need it for normal application development.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 1: Enable &lt;code&gt;pageinspect&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="n"&gt;EXTENSION&lt;/span&gt; &lt;span class="n"&gt;pageinspect&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may need appropriate privileges to create the extension.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 2: Create a Test Table
&lt;/h2&gt;

&lt;p&gt;Let's create a small table:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;page_demo&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Insert some rows:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;page_demo&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;VALUES&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Ahmed'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'John'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Sarah'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Mike'&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'David'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Step 3: Find the Table's Physical Relation
&lt;/h2&gt;

&lt;p&gt;PostgreSQL stores table data in a physical relation.&lt;/p&gt;

&lt;p&gt;We can ask PostgreSQL for the relation's file node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;pg_relation_filenode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'page_demo'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You'll get a number similar to:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;12345
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is an internal identifier used by PostgreSQL's storage system.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 4: Inspect the Page Header
&lt;/h2&gt;

&lt;p&gt;Now let's inspect the first page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;page_header&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;get_raw_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'page_demo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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;You'll see information about the page.&lt;/p&gt;

&lt;p&gt;For example, you'll encounter fields such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lsn
checksum
flags
lower
upper
special
pagesize
version
prune_xid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact values depend on your PostgreSQL version and table.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧐 What Does &lt;code&gt;pagesize&lt;/code&gt; Tell Us?
&lt;/h2&gt;

&lt;p&gt;You should see a value corresponding to the page size, typically:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8192
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8192 bytes
÷ 1024
=
8 KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So we can actually inspect the page and see its size.&lt;/p&gt;




&lt;h2&gt;
  
  
  Step 5: Inspect the Line Pointers
&lt;/h2&gt;

&lt;p&gt;Now let's inspect the items stored on the page:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;heap_page_items&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;get_raw_page&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'page_demo'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&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;This is where things start getting interesting.&lt;/p&gt;

&lt;p&gt;You'll see information associated with tuples and their positions on the page.&lt;/p&gt;

&lt;p&gt;Some of the columns you'll encounter include things such as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;lp
lp_off
lp_flags
lp_len
t_xmin
t_xmax
t_ctid
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Don't worry if these look strange.&lt;/p&gt;

&lt;p&gt;They're the building blocks of PostgreSQL's storage engine.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 One Column You Should Remember: &lt;code&gt;t_ctid&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;You'll see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(0,1)
(0,2)
(0,3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These values are related to the tuple's physical location.&lt;/p&gt;

&lt;p&gt;The general idea is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(block number, offset number)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;(0,3)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;can be thought of as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Page 0
Line Pointer 3
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is called a &lt;strong&gt;CTID&lt;/strong&gt;.&lt;/p&gt;




&lt;h1&gt;
  
  
  🧪 Let's Look at CTID From SQL
&lt;/h1&gt;

&lt;p&gt;We can query:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;ctid&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="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;page_demo&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might see:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; ctid   | id | name
--------+----+-------
 (0,1)  | 1  | Ahmed
 (0,2)  | 2  | John
 (0,3)  | 3  | Sarah
 (0,4)  | 4  | Mike
 (0,5)  | 5  | David
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The exact values aren't guaranteed to look exactly like this on every table/database state, but the important concept is the same.&lt;/p&gt;




&lt;h2&gt;
  
  
  🤯 Here's Where It Gets Interesting
&lt;/h2&gt;

&lt;p&gt;Let's update a row.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;UPDATE&lt;/span&gt; &lt;span class="n"&gt;page_demo&lt;/span&gt;
&lt;span class="k"&gt;SET&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'Ahmed Updated'&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now check:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;ctid&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="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;page_demo&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You may notice that the &lt;code&gt;ctid&lt;/code&gt; has changed.&lt;/p&gt;

&lt;p&gt;Why?&lt;/p&gt;

&lt;p&gt;Because PostgreSQL uses &lt;strong&gt;MVCC&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;An UPDATE isn't simply:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Old row
   ↓
Overwrite
   ↓
New row
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internally, PostgreSQL creates a &lt;strong&gt;new row version&lt;/strong&gt; and marks the old version as no longer visible to appropriate transactions.&lt;/p&gt;

&lt;p&gt;This is one of the reasons understanding pages is so important.&lt;/p&gt;

&lt;p&gt;We'll explore this properly in the next article.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 So What Have We Learned?
&lt;/h2&gt;

&lt;p&gt;A PostgreSQL table isn't simply a collection of rows.&lt;/p&gt;

&lt;p&gt;A simplified mental model is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Database
   │
   ▼
Table
   │
   ▼
Pages
   │
   ▼
Line Pointers
   │
   ▼
Tuples
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And the page itself contains structures that help PostgreSQL manage those tuples.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚨 Why Should Backend Developers Care?
&lt;/h1&gt;

&lt;p&gt;You might be thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I'm a Laravel/Go developer. Why should I care about 8 KB pages?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Because these internals explain things you encounter at the application level.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does UPDATE sometimes create table bloat?
&lt;/h3&gt;

&lt;p&gt;MVCC + tuple versions.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why does VACUUM exist?
&lt;/h3&gt;

&lt;p&gt;Because old tuple versions eventually need cleanup.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why can an UPDATE cause more I/O than expected?
&lt;/h3&gt;

&lt;p&gt;Because PostgreSQL may need to create a new tuple version and update related structures.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why do indexes matter?
&lt;/h3&gt;

&lt;p&gt;Because indexes can reduce the amount of table data/pages PostgreSQL needs to visit.&lt;/p&gt;

&lt;h3&gt;
  
  
  Why can queries become slower as a table grows?
&lt;/h3&gt;

&lt;p&gt;Because the number of pages that need to be processed can increase.&lt;/p&gt;

&lt;p&gt;These aren't random PostgreSQL behaviors.&lt;/p&gt;

&lt;p&gt;They come from the storage architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧩 The Bigger Picture
&lt;/h2&gt;

&lt;p&gt;We're slowly connecting the dots:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                PostgreSQL
                    │
        ┌───────────┴───────────┐
        │                       │
     Query                    Storage
     Layer                      Layer
        │                       │
     Planner                  Pages
        │                       │
     Executor                 Tuples
        │                       │
        └───────────┬───────────┘
                    │
                   MVCC
                    │
              VACUUM / WAL
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Understanding one piece makes the next piece easier.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Final Takeaway
&lt;/h2&gt;

&lt;p&gt;The next time you write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;remember that PostgreSQL isn't just "looking for a row."&lt;/p&gt;

&lt;p&gt;It is working through:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query
 ↓
Execution Plan
 ↓
Relation
 ↓
Page
 ↓
Line Pointer
 ↓
Tuple
 ↓
Visibility
 ↓
Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;And that is just the beginning.&lt;/p&gt;




&lt;h1&gt;
  
  
  🚀 What's Next?
&lt;/h1&gt;

&lt;p&gt;Now that we know what a PostgreSQL page looks like, the next question becomes much more interesting:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;What happens internally when we UPDATE a row?&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's where we'll get into:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MVCC&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xmin&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;xmax&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;tuple versions&lt;/li&gt;
&lt;li&gt;dead tuples&lt;/li&gt;
&lt;li&gt;visibility&lt;/li&gt;
&lt;li&gt;why PostgreSQL doesn't overwrite rows in place&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That's where PostgreSQL internals really start to click.&lt;/p&gt;




&lt;p&gt;I'm learning PostgreSQL internals by going below the SQL layer and documenting what I find along the way.&lt;/p&gt;

&lt;p&gt;If you're learning PostgreSQL too, follow along. 🚀&lt;/p&gt;

</description>
      <category>database</category>
      <category>webdev</category>
      <category>postgres</category>
      <category>sql</category>
    </item>
    <item>
      <title># 🔍 What Actually Happens When PostgreSQL Executes a SELECT Query?</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Sat, 08 Aug 2026 07:21:23 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/-what-actually-happens-when-postgresql-executes-a-select-query-1ejm</link>
      <guid>https://dev.to/ahmedraza_fyntune/-what-actually-happens-when-postgresql-executes-a-select-query-1ejm</guid>
      <description>&lt;p&gt;When we write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;it looks incredibly simple.&lt;/p&gt;

&lt;p&gt;We send SQL.&lt;/p&gt;

&lt;p&gt;PostgreSQL gives us rows.&lt;/p&gt;

&lt;p&gt;But what actually happens between those two steps?&lt;/p&gt;

&lt;p&gt;There is a lot going on internally.&lt;/p&gt;

&lt;p&gt;Understanding this process changed the way I think about database performance.&lt;/p&gt;

&lt;p&gt;Instead of thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"I wrote a query and PostgreSQL executed it."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I started thinking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"What path does PostgreSQL take to turn my SQL into actual data?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Let's follow that journey.&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 The High-Level Journey
&lt;/h2&gt;

&lt;p&gt;A simplified version looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;             SQL Query
                 │
                 ▼
              Parser
                 │
                 ▼
            Parse Tree
                 │
                 ▼
        Analyzer / Rewriter
                 │
                 ▼
           Query Planner
                 │
                 ▼
          Execution Plan
                 │
                 ▼
             Executor
                 │
                 ▼
          Buffer Manager
                 │
          ┌──────┴──────┐
          ▼             ▼
     Shared Buffers    Disk
          │             │
          └──────┬──────┘
                 ▼
              Rows
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Let's break this down.&lt;/p&gt;




&lt;h1&gt;
  
  
  1. The Client Sends SQL
&lt;/h1&gt;

&lt;p&gt;Suppose our application sends:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The PostgreSQL server receives this SQL statement.&lt;/p&gt;

&lt;p&gt;At this point, PostgreSQL doesn't immediately start reading rows from the table.&lt;/p&gt;

&lt;p&gt;First, it needs to understand what we wrote.&lt;/p&gt;




&lt;h2&gt;
  
  
  2. Parser: "What Did You Write?"
&lt;/h2&gt;

&lt;p&gt;The &lt;strong&gt;parser&lt;/strong&gt; checks whether the SQL is syntactically valid.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is valid.&lt;/p&gt;

&lt;p&gt;But:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="n"&gt;SELEC&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;is not valid SQL syntax.&lt;/p&gt;

&lt;p&gt;The parser builds an internal representation called a &lt;strong&gt;parse tree&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;You can think of it as PostgreSQL converting:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SELECT
   ↓
columns
   ↓
table
   ↓
condition
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;into a structure the database can work with.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Analyzer: "What Do These Names Mean?"
&lt;/h2&gt;

&lt;p&gt;Now PostgreSQL needs to understand the objects referenced by the query.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Does the &lt;code&gt;users&lt;/code&gt; table actually exist?&lt;/p&gt;

&lt;p&gt;And:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Does the &lt;code&gt;name&lt;/code&gt; column exist?&lt;/p&gt;

&lt;p&gt;PostgreSQL resolves things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;table names&lt;/li&gt;
&lt;li&gt;column names&lt;/li&gt;
&lt;li&gt;data types&lt;/li&gt;
&lt;li&gt;functions&lt;/li&gt;
&lt;li&gt;operators&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If we write:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;something&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and &lt;code&gt;something&lt;/code&gt; doesn't exist, PostgreSQL will reject the query.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Rewriting
&lt;/h2&gt;

&lt;p&gt;PostgreSQL can transform the query before planning it.&lt;/p&gt;

&lt;p&gt;This stage is particularly important for things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;views&lt;/li&gt;
&lt;li&gt;rules&lt;/li&gt;
&lt;li&gt;some query transformations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For a simple query, you might not notice this stage.&lt;/p&gt;

&lt;p&gt;But internally, PostgreSQL can rewrite the query into another representation that is easier to plan and execute.&lt;/p&gt;




&lt;h2&gt;
  
  
  5. The Query Planner
&lt;/h2&gt;

&lt;p&gt;Now things get interesting.&lt;/p&gt;

&lt;p&gt;PostgreSQL needs to decide:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"What's the cheapest way to execute this query?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Suppose we have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'user@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PostgreSQL might have several possible strategies.&lt;/p&gt;

&lt;h3&gt;
  
  
  Option 1: Sequential Scan
&lt;/h3&gt;

&lt;p&gt;Read the table from beginning to end.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Row 1
Row 2
Row 3
Row 4
...
Row 1,000,000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Option 2: Index Scan
&lt;/h3&gt;

&lt;p&gt;If an appropriate index exists:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_users_email&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;PostgreSQL may use the index to locate the matching row much more efficiently.&lt;/p&gt;

&lt;p&gt;The planner compares possible execution strategies using estimated costs.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. EXPLAIN Lets Us See the Plan
&lt;/h2&gt;

&lt;p&gt;We can ask PostgreSQL what it intends to do:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'user@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You might see something like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Index Scan using idx_users_email on users
  Index Cond: (email = 'user@example.com')
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now we have a window into the planner's decision.&lt;/p&gt;

&lt;p&gt;This is one reason &lt;code&gt;EXPLAIN&lt;/code&gt; is such an important tool for backend developers.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. The Executor Takes Over
&lt;/h2&gt;

&lt;p&gt;The planner creates an &lt;strong&gt;execution plan&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The executor then actually runs that plan.&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Index Scan
    ↓
Find matching index entry
    ↓
Locate table row
    ↓
Return row
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The executor is responsible for producing the actual result.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. But Where Is the Data?
&lt;/h2&gt;

&lt;p&gt;This is where PostgreSQL's storage internals become important.&lt;/p&gt;

&lt;p&gt;The table data ultimately lives on disk.&lt;/p&gt;

&lt;p&gt;But PostgreSQL doesn't simply perform a disk read for every row.&lt;/p&gt;

&lt;p&gt;That would be extremely expensive.&lt;/p&gt;

&lt;p&gt;Instead, PostgreSQL uses a &lt;strong&gt;buffer cache&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;One important component involved here is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;shared_buffers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;These are PostgreSQL's shared memory buffers used to cache data pages.&lt;/p&gt;




&lt;h2&gt;
  
  
  9. PostgreSQL Works With Pages
&lt;/h2&gt;

&lt;p&gt;PostgreSQL doesn't think of a table simply as:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;User 1
User 2
User 3
User 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Internally, table data is organized into fixed-size &lt;strong&gt;pages&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A PostgreSQL page is normally:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;8 KB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;So conceptually:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Table
│
├── Page 0
├── Page 1
├── Page 2
├── Page 3
└── ...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Each page contains multiple tuples/rows depending on their size.&lt;/p&gt;

&lt;p&gt;This is one of the most important concepts to understand before diving into PostgreSQL internals.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Buffer Hit vs Disk Read
&lt;/h2&gt;

&lt;p&gt;Suppose PostgreSQL needs a page.&lt;/p&gt;

&lt;p&gt;First, it can check whether that page is already available in memory.&lt;/p&gt;

&lt;p&gt;If it is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query
 ↓
Buffer Manager
 ↓
Page already in memory
 ↓
Buffer Hit
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much faster.&lt;/p&gt;

&lt;p&gt;If it isn't:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Query
 ↓
Buffer Manager
 ↓
Page not in memory
 ↓
Read from disk
 ↓
Put page into buffer
 ↓
Use the data
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is why memory and I/O have such a significant effect on database performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  11. What Happens With Our Indexed Query?
&lt;/h2&gt;

&lt;p&gt;Let's put everything together.&lt;/p&gt;

&lt;p&gt;We execute:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'user@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Suppose we have:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_users_email&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;email&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A simplified execution might look like:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL
 │
 ▼
Parser
 │
 ▼
Analyzer
 │
 ▼
Planner
 │
 │
 ├── Sequential Scan?
 │
 └── Index Scan?  ← selected
 │
 ▼
Executor
 │
 ▼
Index
 │
 ▼
Find matching tuple location
 │
 ▼
Check required table page
 │
 ├── Buffer Hit
 │
 └── Disk Read
 │
 ▼
Return row
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That's quite a journey for one simple &lt;code&gt;SELECT&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  12. Why Should Application Developers Care?
&lt;/h2&gt;

&lt;p&gt;Because database internals directly affect application performance.&lt;/p&gt;

&lt;p&gt;Consider two queries:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The difference isn't simply about SQL style.&lt;/p&gt;

&lt;p&gt;It can affect:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;amount of data read&lt;/li&gt;
&lt;li&gt;memory usage&lt;/li&gt;
&lt;li&gt;network traffic&lt;/li&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;serialization&lt;/li&gt;
&lt;li&gt;index usage&lt;/li&gt;
&lt;li&gt;overall API latency&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Understanding what's happening underneath helps us make better decisions.&lt;/p&gt;




&lt;h2&gt;
  
  
  13. A Simple Mental Model
&lt;/h2&gt;

&lt;p&gt;When debugging a slow PostgreSQL query, I now think about it in this order:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1. What SQL did I write?
          ↓
2. How did PostgreSQL parse it?
          ↓
3. What execution plan did PostgreSQL choose?
          ↓
4. Is it using an index?
          ↓
5. How many rows/pages are being processed?
          ↓
6. Are pages already in memory?
          ↓
7. How much disk I/O is happening?
          ↓
8. Is the planner's estimate accurate?
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is much more useful than blindly adding indexes.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 The Most Important Lesson
&lt;/h2&gt;

&lt;p&gt;A database isn't just:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL → Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;There is a whole execution pipeline between them:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;SQL
 ↓
Parser
 ↓
Analyzer / Rewriter
 ↓
Planner
 ↓
Execution Plan
 ↓
Executor
 ↓
Buffer Manager
 ↓
Pages
 ↓
Disk / Memory
 ↓
Result
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Once you understand this pipeline, concepts like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;indexes&lt;/li&gt;
&lt;li&gt;&lt;code&gt;EXPLAIN ANALYZE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;shared buffers&lt;/li&gt;
&lt;li&gt;sequential scans&lt;/li&gt;
&lt;li&gt;index scans&lt;/li&gt;
&lt;li&gt;MVCC&lt;/li&gt;
&lt;li&gt;VACUUM&lt;/li&gt;
&lt;li&gt;WAL&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;start making much more sense.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 What's Next?
&lt;/h2&gt;

&lt;p&gt;This is only the beginning.&lt;/p&gt;

&lt;p&gt;If you're also learning PostgreSQL internals, follow along. I'm documenting the concepts as I learn them and trying to explain them without assuming you're already a database expert.&lt;/p&gt;

</description>
      <category>postgres</category>
      <category>database</category>
      <category>webdev</category>
      <category>programming</category>
    </item>
    <item>
      <title>🚀 How I Optimize Slow MySQL Queries in Laravel: My Practical Checklist</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Tue, 14 Jul 2026 09:48:27 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/how-i-optimize-slow-mysql-queries-in-laravel-my-practical-checklist-1f9h</link>
      <guid>https://dev.to/ahmedraza_fyntune/how-i-optimize-slow-mysql-queries-in-laravel-my-practical-checklist-1f9h</guid>
      <description>&lt;p&gt;One of the most common questions I hear is:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;"My API is slow. Where do I start?"&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The first instinct is usually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upgrade the server&lt;/li&gt;
&lt;li&gt;Increase CPU&lt;/li&gt;
&lt;li&gt;Add more RAM&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;But in many cases, &lt;strong&gt;the database query is the real bottleneck&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Whenever I investigate a slow Laravel application, I follow the same checklist. It helps me identify performance issues before making unnecessary infrastructure changes.&lt;/p&gt;

&lt;p&gt;Let's go through it.&lt;/p&gt;




&lt;h2&gt;
  
  
  1️⃣ Find the Slow Queries First
&lt;/h2&gt;

&lt;p&gt;Don't start optimizing random queries.&lt;/p&gt;

&lt;p&gt;Start with the queries that are executed the most or take the most time.&lt;/p&gt;

&lt;p&gt;Useful tools:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Laravel Telescope&lt;/li&gt;
&lt;li&gt;Laravel Debugbar (development)&lt;/li&gt;
&lt;li&gt;MySQL Slow Query Log&lt;/li&gt;
&lt;li&gt;Application Performance Monitoring (APM)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can't optimize what you haven't measured.&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ Stop Using &lt;code&gt;SELECT *&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;One of the easiest improvements.&lt;/p&gt;

&lt;p&gt;❌ Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Why?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Less data transferred&lt;/li&gt;
&lt;li&gt;Lower memory usage&lt;/li&gt;
&lt;li&gt;Faster response&lt;/li&gt;
&lt;li&gt;Easier for MySQL to use covering indexes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Only fetch the columns your application actually needs.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ Always Check the Execution Plan
&lt;/h2&gt;

&lt;p&gt;Before changing anything, run:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;EXPLAIN&lt;/span&gt;
&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;email&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'john@example.com'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Things I usually look for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is MySQL scanning the whole table?&lt;/li&gt;
&lt;li&gt;Is an index being used?&lt;/li&gt;
&lt;li&gt;How many rows are examined?&lt;/li&gt;
&lt;li&gt;Is there a temporary table?&lt;/li&gt;
&lt;li&gt;Is filesort being used?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;code&gt;EXPLAIN&lt;/code&gt; often tells you exactly why a query is slow.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ Verify Your Indexes
&lt;/h2&gt;

&lt;p&gt;Indexes are one of the biggest performance improvements you can make—but only when they match your queries.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Create an index:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_customer_id&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now MySQL can jump directly to the matching rows instead of scanning the entire table.&lt;/p&gt;




&lt;h2&gt;
  
  
  5️⃣ Look for Composite Index Opportunities
&lt;/h2&gt;

&lt;p&gt;Suppose your query is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;total&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;customer_id&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'paid'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instead of two separate indexes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;customer_id
status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A composite index is often better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;INDEX&lt;/span&gt; &lt;span class="n"&gt;idx_customer_status&lt;/span&gt;
&lt;span class="k"&gt;ON&lt;/span&gt; &lt;span class="n"&gt;orders&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;customer_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;The order of columns inside a composite index matters.&lt;/p&gt;




&lt;h2&gt;
  
  
  6️⃣ Avoid Functions in the WHERE Clause
&lt;/h2&gt;

&lt;p&gt;This prevents MySQL from using indexes efficiently.&lt;/p&gt;

&lt;p&gt;❌ Bad:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="nb"&gt;YEAR&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;created_at&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2026&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Better:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt;
&lt;span class="k"&gt;WHERE&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="s1"&gt;'2026-01-01'&lt;/span&gt;
&lt;span class="k"&gt;AND&lt;/span&gt; &lt;span class="n"&gt;created_at&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'2027-01-01'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now MySQL can use an index on &lt;code&gt;created_at&lt;/code&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  7️⃣ Watch for N+1 Queries
&lt;/h2&gt;

&lt;p&gt;This is one of the most common Laravel performance problems.&lt;/p&gt;

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

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;echo&lt;/span&gt; &lt;span class="nv"&gt;$user&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;posts&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;This may execute:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;1 query for users&lt;/li&gt;
&lt;li&gt;N queries for posts&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead, eager load the relationship:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;with&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'posts'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Much fewer database queries.&lt;/p&gt;




&lt;h2&gt;
  
  
  8️⃣ Cache Frequently Used Data
&lt;/h2&gt;

&lt;p&gt;Not every request needs to hit the database.&lt;/p&gt;

&lt;p&gt;For data that changes infrequently, caching can dramatically reduce database load.&lt;/p&gt;

&lt;p&gt;Example with Laravel:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nv"&gt;$users&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nc"&gt;Cache&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;remember&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s1"&gt;'users'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;300&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;fn&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&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;The first request reads from the database.&lt;/p&gt;

&lt;p&gt;Subsequent requests are served from the cache until it expires.&lt;/p&gt;




&lt;h2&gt;
  
  
  9️⃣ Add Pagination
&lt;/h2&gt;

&lt;p&gt;Fetching thousands of rows at once is rarely necessary.&lt;/p&gt;

&lt;p&gt;Instead of:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;all&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight php"&gt;&lt;code&gt;&lt;span class="nc"&gt;User&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nf"&gt;paginate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Faster queries&lt;/li&gt;
&lt;li&gt;Smaller responses&lt;/li&gt;
&lt;li&gt;Better user experience&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔟 Measure Again
&lt;/h2&gt;

&lt;p&gt;Optimization isn't finished after adding an index.&lt;/p&gt;

&lt;p&gt;Measure the results.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Query execution time&lt;/li&gt;
&lt;li&gt;Number of rows scanned&lt;/li&gt;
&lt;li&gt;API response time&lt;/li&gt;
&lt;li&gt;CPU usage&lt;/li&gt;
&lt;li&gt;Database load&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Always verify that your changes actually improved performance.&lt;/p&gt;




&lt;h2&gt;
  
  
  My Personal Optimization Workflow
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Slow API

↓

Identify the slow query

↓

Run EXPLAIN

↓

Check indexes

↓

Remove SELECT *

↓

Look for N+1 queries

↓

Cache frequently accessed data

↓

Measure again
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;Performance optimization isn't about applying every trick you know.&lt;/p&gt;

&lt;p&gt;It's about understanding &lt;strong&gt;why a query is slow&lt;/strong&gt; and making targeted improvements.&lt;/p&gt;

&lt;p&gt;Most of the biggest gains I've seen came from simple changes like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Selecting only the required columns&lt;/li&gt;
&lt;li&gt;Adding the right index&lt;/li&gt;
&lt;li&gt;Eliminating N+1 queries&lt;/li&gt;
&lt;li&gt;Caching frequently requested data&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small optimizations, applied consistently, can have a huge impact on application performance.&lt;/p&gt;




&lt;p&gt;What are your go-to techniques for optimizing slow MySQL queries? I'd love to hear your approach in the comments.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>mysql</category>
      <category>development</category>
      <category>database</category>
    </item>
    <item>
      <title># 🎉 Happy Birthday, PHP! 🎂</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 10 Jun 2026 18:34:45 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/-happy-birthday-php-1moe</link>
      <guid>https://dev.to/ahmedraza_fyntune/-happy-birthday-php-1moe</guid>
      <description>&lt;p&gt;On June 8th, we celebrate another year of PHP—the language that transformed my career from writing simple CRUD applications to building enterprise-grade systems used by thousands of users.&lt;/p&gt;

&lt;p&gt;Over the last few years, PHP has enabled me to build:&lt;/p&gt;

&lt;p&gt;✅ Insurance API integrations with multiple providers&lt;br&gt;
✅ Enterprise-scale applications&lt;br&gt;
✅ Customer and business dashboards&lt;br&gt;
✅ Standalone REST APIs and microservices&lt;br&gt;
✅ PDF generation and document automation systems&lt;br&gt;
✅ AI-powered application features&lt;br&gt;
✅ School and hotel management solutions&lt;br&gt;
✅ High-performance applications with Laravel, OpenSwoole, and FrankenPHP&lt;/p&gt;

&lt;p&gt;What I admire most about PHP is its evolution. The PHP of today is not the PHP people joked about years ago.&lt;/p&gt;

&lt;p&gt;Modern PHP offers:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Strong typing&lt;/li&gt;
&lt;li&gt;Enums and Attributes&lt;/li&gt;
&lt;li&gt;Fibers for async programming&lt;/li&gt;
&lt;li&gt;Improved performance&lt;/li&gt;
&lt;li&gt;Excellent tooling&lt;/li&gt;
&lt;li&gt;A mature ecosystem&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Combined with frameworks like Laravel and Symfony, PHP remains one of the most productive technologies for building real-world business applications.&lt;/p&gt;

&lt;p&gt;From handling millions of API requests to powering enterprise workflows, PHP continues to prove its reliability every day.&lt;/p&gt;

&lt;p&gt;A big thank you to Rasmus Lerdorf, the PHP core team, and the entire open-source community for making this ecosystem what it is today.&lt;/p&gt;

&lt;p&gt;Happy Birthday, PHP! 🎉&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's the most interesting project you've built with PHP?&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>programming</category>
      <category>php</category>
      <category>laravel</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Why 1 Million GoRoutines Don't Use Your GPU: Understanding CPUs, GPUs, Go's GMP Scheduler, and GPU Computing</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Tue, 02 Jun 2026 13:37:43 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/why-1-million-goroutines-dont-use-your-gpu-understanding-cpus-gpus-gos-gmp-scheduler-and-gpu-1m6i</link>
      <guid>https://dev.to/ahmedraza_fyntune/why-1-million-goroutines-dont-use-your-gpu-understanding-cpus-gpus-gos-gmp-scheduler-and-gpu-1m6i</guid>
      <description>&lt;p&gt;&lt;strong&gt;Article Goal:&lt;/strong&gt;&lt;br&gt;
Write a deep technical article for software engineers explaining why millions of Go goroutines still execute on CPU cores instead of GPU cores, even though both ultimately process binary instructions. The article should start from first principles and progressively build understanding of CPU architecture, GPU architecture, Go's GMP scheduler, operating system threads, concurrency vs parallelism, and GPU computing.&lt;/p&gt;


&lt;h3&gt;
  
  
  Sections to Cover
&lt;/h3&gt;
&lt;h4&gt;
  
  
  1. Introduction
&lt;/h4&gt;

&lt;p&gt;Discuss a common misconception:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"If a GPU has thousands of cores and Go can create millions of goroutines, why doesn't Go automatically run goroutines on the GPU?"&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Introduce the core idea:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Goroutines run on CPU threads.&lt;/li&gt;
&lt;li&gt;GPUs are specialized compute devices.&lt;/li&gt;
&lt;li&gt;Concurrency is different from GPU parallelism.&lt;/li&gt;
&lt;/ul&gt;


&lt;h4&gt;
  
  
  2. Understanding CPU Architecture
&lt;/h4&gt;

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

&lt;ul&gt;
&lt;li&gt;Modern CPUs (Intel i5, i7, AMD Ryzen).&lt;/li&gt;
&lt;li&gt;Small number of powerful cores.&lt;/li&gt;
&lt;li&gt;Branch prediction.&lt;/li&gt;
&lt;li&gt;Large caches.&lt;/li&gt;
&lt;li&gt;Out-of-order execution.&lt;/li&gt;
&lt;li&gt;Context switching.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Include diagram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU
├── Core 1
├── Core 2
├── Core 3
└── Core 4
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Discuss why CPUs excel at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;APIs&lt;/li&gt;
&lt;li&gt;Databases&lt;/li&gt;
&lt;li&gt;Filesystems&lt;/li&gt;
&lt;li&gt;Operating system tasks&lt;/li&gt;
&lt;li&gt;Business logic&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  3. Understanding GPU Architecture
&lt;/h4&gt;

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

&lt;ul&gt;
&lt;li&gt;NVIDIA RTX 4090&lt;/li&gt;
&lt;li&gt;CUDA cores&lt;/li&gt;
&lt;li&gt;Streaming Multiprocessors&lt;/li&gt;
&lt;li&gt;Massive parallelism&lt;/li&gt;
&lt;li&gt;Throughput-oriented design&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diagram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;GPU
├── SM 1
│   ├── 100s of threads
├── SM 2
│   ├── 100s of threads
...
└── SM N
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Discuss why GPUs excel at:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Matrix multiplication&lt;/li&gt;
&lt;li&gt;AI&lt;/li&gt;
&lt;li&gt;Simulations&lt;/li&gt;
&lt;li&gt;Image processing&lt;/li&gt;
&lt;li&gt;Scientific computing&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  4. Go's GMP Scheduler Explained
&lt;/h4&gt;

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

&lt;p&gt;G = Goroutine&lt;/p&gt;

&lt;p&gt;M = Machine (OS Thread)&lt;/p&gt;

&lt;p&gt;P = Processor (Logical Scheduler)&lt;/p&gt;

&lt;p&gt;Diagram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1,000,000 Goroutines
        ↓
 Go Scheduler
        ↓
     P Pool
        ↓
    M Threads
        ↓
    CPU Cores
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;P is NOT a GPU processor.&lt;/li&gt;
&lt;li&gt;P is a scheduling context inside Go runtime.&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  5. What Happens When You Launch One Million Goroutines
&lt;/h4&gt;

&lt;p&gt;Example:&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;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;1000000&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="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;i&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;Explain:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Go does not create 1 million OS threads.&lt;/li&gt;
&lt;li&gt;Goroutines are multiplexed onto a small number of CPU threads.&lt;/li&gt;
&lt;li&gt;Scheduler performs work stealing.&lt;/li&gt;
&lt;li&gt;Lightweight stack allocation.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Memory comparison:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;OS Thread ≈ 1MB–8MB
Goroutine ≈ 2KB initial stack
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  6. Why API Calls Don't Benefit From GPUs
&lt;/h4&gt;

&lt;p&gt;Example:&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;span class="n"&gt;fetchMarketData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Break down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DNS&lt;/li&gt;
&lt;li&gt;TCP&lt;/li&gt;
&lt;li&gt;TLS&lt;/li&gt;
&lt;li&gt;Socket operations&lt;/li&gt;
&lt;li&gt;Waiting for remote server&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Timeline:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;CPU Work: 0.5ms
Network Wait: 99.5ms
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explain why GPU acceleration provides no benefit.&lt;/p&gt;




&lt;h4&gt;
  
  
  7. When GPUs Actually Shine
&lt;/h4&gt;

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

&lt;ul&gt;
&lt;li&gt;Black-Scholes calculations&lt;/li&gt;
&lt;li&gt;Greeks calculations&lt;/li&gt;
&lt;li&gt;Monte Carlo simulations&lt;/li&gt;
&lt;li&gt;Option chain analytics&lt;/li&gt;
&lt;li&gt;Risk analysis&lt;/li&gt;
&lt;li&gt;AI trading models&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Diagram:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;1 Million Option Contracts
        ↓
GPU Threads
        ↓
Delta
Gamma
Theta
Vega
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h4&gt;
  
  
  8. Go + CUDA Architecture
&lt;/h4&gt;

&lt;p&gt;Show architecture:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Go
├── Market Data
├── APIs
├── WebSockets
├── Risk Engine
└── GPU Dispatcher
          ↓
      CUDA
          ↓
        RTX 4090
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Explain that Go orchestrates work while CUDA executes calculations.&lt;/p&gt;




&lt;h4&gt;
  
  
  9. Python vs Go vs Rust for GPU Workloads
&lt;/h4&gt;

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

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Language&lt;/th&gt;
&lt;th&gt;CPU Performance&lt;/th&gt;
&lt;th&gt;GPU Integration&lt;/th&gt;
&lt;th&gt;Typical Use&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Python&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;Excellent&lt;/td&gt;
&lt;td&gt;AI/ML&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Go&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;td&gt;Limited&lt;/td&gt;
&lt;td&gt;Services&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Rust&lt;/td&gt;
&lt;td&gt;Very High&lt;/td&gt;
&lt;td&gt;Growing&lt;/td&gt;
&lt;td&gt;Systems&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C++&lt;/td&gt;
&lt;td&gt;Maximum&lt;/td&gt;
&lt;td&gt;Native&lt;/td&gt;
&lt;td&gt;HPC&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Explain that most Python GPU workloads ultimately execute C++/CUDA kernels.&lt;/p&gt;




&lt;h4&gt;
  
  
  10. Real Trading System Architecture
&lt;/h4&gt;

&lt;p&gt;Design a production-grade option screener:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Market Feed
      ↓
Go Services
      ↓
Kafka
      ↓
GPU Cluster
      ↓
Risk Engine
      ↓
Trade Signals
      ↓
Execution Engine
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;ul&gt;
&lt;li&gt;Scalability&lt;/li&gt;
&lt;li&gt;Latency&lt;/li&gt;
&lt;li&gt;GPU utilization&lt;/li&gt;
&lt;li&gt;Cost considerations&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;
  
  
  11. Key Takeaways
&lt;/h4&gt;

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

&lt;ul&gt;
&lt;li&gt;Goroutines run on CPUs.&lt;/li&gt;
&lt;li&gt;GMP's P is not a GPU processor.&lt;/li&gt;
&lt;li&gt;GPUs are not replacements for CPUs.&lt;/li&gt;
&lt;li&gt;GPUs accelerate mathematical workloads.&lt;/li&gt;
&lt;li&gt;Go is excellent for orchestration.&lt;/li&gt;
&lt;li&gt;CUDA/Rust/C++ are used for extreme numerical workloads.&lt;/li&gt;
&lt;li&gt;Modern trading systems combine CPU concurrency and GPU acceleration.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>programming</category>
      <category>architecture</category>
      <category>go</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Using Redis for API Caching in Go (Speed Up Your Backend)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Sat, 09 May 2026 13:15:34 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/using-redis-for-api-caching-in-go-speed-up-your-backend-3nfc</link>
      <guid>https://dev.to/ahmedraza_fyntune/using-redis-for-api-caching-in-go-speed-up-your-backend-3nfc</guid>
      <description>&lt;p&gt;After building APIs in Go, the next big question is:&lt;/p&gt;

&lt;p&gt;👉 How do you make them faster?&lt;/p&gt;

&lt;p&gt;This is where Redis comes in.&lt;/p&gt;

&lt;p&gt;In this post, we’ll:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Connect Go with Redis&lt;/li&gt;
&lt;li&gt;Cache API responses&lt;/li&gt;
&lt;li&gt;Reduce database load&lt;/li&gt;
&lt;li&gt;Improve performance&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 What is Redis?
&lt;/h2&gt;

&lt;p&gt;Redis is an in-memory database used for:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Caching&lt;/li&gt;
&lt;li&gt;Sessions&lt;/li&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;li&gt;Real-time systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of Redis like:&lt;br&gt;
👉 “Super-fast temporary storage”&lt;/p&gt;

&lt;p&gt;Instead of hitting PostgreSQL every time:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;First request → DB&lt;/li&gt;
&lt;li&gt;Next requests → Redis cache ⚡&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  ⚙️ Install Redis Package
&lt;/h2&gt;



&lt;p&gt;```bash id="gq78f0"&lt;br&gt;
go get github.com/redis/go-redis/v9&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 📦 Connect Redis



```go id="lb7m2n"
package main

import (
    "context"
    "github.com/redis/go-redis/v9"
)

var ctx = context.Background()

var rdb = redis.NewClient(&amp;amp;redis.Options{
    Addr: "localhost:6379",
})
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🗄️ Example API Response
&lt;/h2&gt;

&lt;p&gt;Normally:&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```go id="1h9v4t"&lt;br&gt;
func getUsersFromDB() string {&lt;br&gt;
    return "Users from PostgreSQL"&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


But hitting DB repeatedly is expensive.

---

## ⚡ Add Redis Caching



```go id="h4m92g"
func getUsers(w http.ResponseWriter, r *http.Request) {

    cachedData, err := rdb.Get(ctx, "users").Result()

    if err == nil {
        w.Write([]byte("Cache Hit 🚀\n" + cachedData))
        return
    }

    data := getUsersFromDB()

    rdb.Set(ctx, "users", data, time.Minute*5)

    w.Write([]byte("DB Hit 🐘\n" + data))
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  🔥 What’s Happening Here?
&lt;/h2&gt;
&lt;h3&gt;
  
  
  First Request
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Redis has no data&lt;/li&gt;
&lt;li&gt;Fetch from DB&lt;/li&gt;
&lt;li&gt;Store in Redis&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  Next Requests
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Redis already has data&lt;/li&gt;
&lt;li&gt;Return instantly ⚡&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  📊 Why Caching Matters
&lt;/h2&gt;

&lt;p&gt;Without cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → API → Database
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With cache:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Client → API → Redis ⚡
             ↓
          Database (less often)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 Benefits of Redis
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Faster APIs&lt;/li&gt;
&lt;li&gt;Reduced DB load&lt;/li&gt;
&lt;li&gt;Better scalability&lt;/li&gt;
&lt;li&gt;Improved user experience&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚠️ Important Production Notes
&lt;/h2&gt;

&lt;p&gt;Don’t cache forever.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Set expiration time&lt;/li&gt;
&lt;li&gt;Clear cache after updates&lt;/li&gt;
&lt;li&gt;Avoid stale data&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Real-World Usage
&lt;/h2&gt;

&lt;p&gt;Redis is used in:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Authentication systems&lt;/li&gt;
&lt;li&gt;Rate limiting&lt;/li&gt;
&lt;li&gt;API caching&lt;/li&gt;
&lt;li&gt;Queues&lt;/li&gt;
&lt;li&gt;Real-time apps&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Companies like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Netflix&lt;/li&gt;
&lt;li&gt;Instagram&lt;/li&gt;
&lt;li&gt;Twitter&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;use Redis heavily.&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;Caching is one of the easiest ways to improve backend performance.&lt;/p&gt;

&lt;p&gt;You don’t always need:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Bigger servers&lt;/li&gt;
&lt;li&gt;More CPUs&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Sometimes…&lt;br&gt;
👉 You just need smarter architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Coming Next
&lt;/h2&gt;

&lt;p&gt;👉 Rate Limiting in Go API&lt;br&gt;
👉 Background Jobs with Redis&lt;br&gt;
👉 Redis Pub/Sub in Go&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>api</category>
      <category>programming</category>
      <category>go</category>
    </item>
    <item>
      <title>Structuring a Go API Like Laravel (Controller, Service, Repository)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Mon, 04 May 2026 11:39:24 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/structuring-a-go-api-like-laravel-controller-service-repository-1675</link>
      <guid>https://dev.to/ahmedraza_fyntune/structuring-a-go-api-like-laravel-controller-service-repository-1675</guid>
      <description>&lt;p&gt;If you're coming from Laravel, one thing feels missing in Go:&lt;/p&gt;

&lt;p&gt;👉 Structure&lt;/p&gt;

&lt;p&gt;By default, Go gives you freedom—but no clear architecture.&lt;/p&gt;

&lt;p&gt;So in this post, we’ll structure a Go API like Laravel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controller → Handle request&lt;/li&gt;
&lt;li&gt;Service → Business logic&lt;/li&gt;
&lt;li&gt;Repository → Database&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Why Structure Matters
&lt;/h2&gt;

&lt;p&gt;Without structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code becomes messy quickly&lt;/li&gt;
&lt;li&gt;Hard to scale&lt;/li&gt;
&lt;li&gt;Difficult to debug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean separation of concerns&lt;/li&gt;
&lt;li&gt;Easier testing&lt;/li&gt;
&lt;li&gt;Production-ready codebase&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📁 Folder Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
 ├── main.go
 ├── controller/
 ├── service/
 ├── repository/
 ├── model/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Model (model/user.go)
&lt;/h2&gt;



&lt;p&gt;```go id="6pn1u5"&lt;br&gt;
package model&lt;/p&gt;

&lt;p&gt;type User struct {&lt;br&gt;
    ID   int    &lt;code&gt;json:"id"&lt;/code&gt;&lt;br&gt;
    Name string &lt;code&gt;json:"name"&lt;/code&gt;&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🗄️ Repository Layer

Handles database queries



```go id="aq1u8u"
package repository

import (
    "database/sql"
    "yourapp/model"
)

type UserRepository struct {
    DB *sql.DB
}

func (r *UserRepository) GetAll() ([]model.User, error) {
    rows, err := r.DB.Query("SELECT id, name FROM users")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var users []model.User

    for rows.Next() {
        var user model.User
        rows.Scan(&amp;amp;user.ID, &amp;amp;user.Name)
        users = append(users, user)
    }

    return users, nil
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Service Layer
&lt;/h2&gt;

&lt;p&gt;Handles business logic&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```go id="qf1kmz"&lt;br&gt;
package service&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "yourapp/model"&lt;br&gt;
    "yourapp/repository"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;type UserService struct {&lt;br&gt;
    Repo *repository.UserRepository&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;func (s *UserService) GetUsers() ([]model.User, error) {&lt;br&gt;
    return s.Repo.GetAll()&lt;br&gt;
}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🌐 Controller Layer

Handles HTTP requests



```go id="n8t1rn"
package controller

import (
    "encoding/json"
    "net/http"
    "yourapp/service"
)

type UserController struct {
    Service *service.UserService
}

func (c *UserController) GetUsers(w http.ResponseWriter, r *http.Request) {
    users, err := c.Service.GetUsers()
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    json.NewEncoder(w).Encode(users)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 main.go (Wire Everything)
&lt;/h2&gt;



&lt;p&gt;```go id="b4r8f2"&lt;br&gt;
package main&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "database/sql"&lt;br&gt;
    "log"&lt;br&gt;
    "net/http"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_ "github.com/lib/pq"

"yourapp/controller"
"yourapp/repository"
"yourapp/service"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;func main() {&lt;br&gt;
    db, _ := sql.Open("postgres", "your_connection_string")&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo := &amp;amp;repository.UserRepository{DB: db}
service := &amp;amp;service.UserService{Repo: repo}
controller := &amp;amp;controller.UserController{Service: service}

http.HandleFunc("/users", controller.GetUsers)

log.Println("Server running on :8080")
http.ListenAndServe(":8080", nil)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🔥 What You Achieved

* Clean architecture like Laravel
* Separation of concerns
* Scalable Go backend structure

---

## 🧭 When to Use This

Use this structure when:

* Building real APIs
* Working in teams
* Scaling projects

---

## 💬 Final Thought

Go doesn’t force structure…

👉 But professionals create one.

If you combine Go performance with Laravel-style architecture, you get the best of both worlds.

---

## 🚀 Coming Next

👉 Add middleware (logging, auth)
👉 Add validation layer
👉 Dockerize Go + PostgreSQL

---

#golang #backend #architecture #programming #webdev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>webdev</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Structuring a Go API Like Laravel (Controller, Service, Repository)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Thu, 30 Apr 2026 19:21:12 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/structuring-a-go-api-like-laravel-controller-service-repository-31n</link>
      <guid>https://dev.to/ahmedraza_fyntune/structuring-a-go-api-like-laravel-controller-service-repository-31n</guid>
      <description>&lt;p&gt;If you're coming from Laravel, one thing feels missing in Go:&lt;/p&gt;

&lt;p&gt;👉 Structure&lt;/p&gt;

&lt;p&gt;By default, Go gives you freedom—but no clear architecture.&lt;/p&gt;

&lt;p&gt;So in this post, we’ll structure a Go API like Laravel:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Controller → Handle request&lt;/li&gt;
&lt;li&gt;Service → Business logic&lt;/li&gt;
&lt;li&gt;Repository → Database&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧠 Why Structure Matters
&lt;/h2&gt;

&lt;p&gt;Without structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Code becomes messy quickly&lt;/li&gt;
&lt;li&gt;Hard to scale&lt;/li&gt;
&lt;li&gt;Difficult to debug&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With structure:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean separation of concerns&lt;/li&gt;
&lt;li&gt;Easier testing&lt;/li&gt;
&lt;li&gt;Production-ready codebase&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  📁 Folder Structure
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;project/
 ├── main.go
 ├── controller/
 ├── service/
 ├── repository/
 ├── model/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Model (model/user.go)
&lt;/h2&gt;



&lt;p&gt;```go id="6pn1u5"&lt;br&gt;
package model&lt;/p&gt;

&lt;p&gt;type User struct {&lt;br&gt;
    ID   int    &lt;code&gt;json:"id"&lt;/code&gt;&lt;br&gt;
    Name string &lt;code&gt;json:"name"&lt;/code&gt;&lt;br&gt;
}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🗄️ Repository Layer

Handles database queries



```go id="aq1u8u"
package repository

import (
    "database/sql"
    "yourapp/model"
)

type UserRepository struct {
    DB *sql.DB
}

func (r *UserRepository) GetAll() ([]model.User, error) {
    rows, err := r.DB.Query("SELECT id, name FROM users")
    if err != nil {
        return nil, err
    }
    defer rows.Close()

    var users []model.User

    for rows.Next() {
        var user model.User
        rows.Scan(&amp;amp;user.ID, &amp;amp;user.Name)
        users = append(users, user)
    }

    return users, nil
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ⚙️ Service Layer
&lt;/h2&gt;

&lt;p&gt;Handles business logic&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;```go id="qf1kmz"&lt;br&gt;
package service&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "yourapp/model"&lt;br&gt;
    "yourapp/repository"&lt;br&gt;
)&lt;/p&gt;

&lt;p&gt;type UserService struct {&lt;br&gt;
    Repo *repository.UserRepository&lt;br&gt;
}&lt;/p&gt;

&lt;p&gt;func (s *UserService) GetUsers() ([]model.User, error) {&lt;br&gt;
    return s.Repo.GetAll()&lt;br&gt;
}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🌐 Controller Layer

Handles HTTP requests



```go id="n8t1rn"
package controller

import (
    "encoding/json"
    "net/http"
    "yourapp/service"
)

type UserController struct {
    Service *service.UserService
}

func (c *UserController) GetUsers(w http.ResponseWriter, r *http.Request) {
    users, err := c.Service.GetUsers()
    if err != nil {
        http.Error(w, err.Error(), 500)
        return
    }

    json.NewEncoder(w).Encode(users)
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🚀 main.go (Wire Everything)
&lt;/h2&gt;



&lt;p&gt;```go id="b4r8f2"&lt;br&gt;
package main&lt;/p&gt;

&lt;p&gt;import (&lt;br&gt;
    "database/sql"&lt;br&gt;
    "log"&lt;br&gt;
    "net/http"&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;_ "github.com/lib/pq"

"yourapp/controller"
"yourapp/repository"
"yourapp/service"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;)&lt;/p&gt;

&lt;p&gt;func main() {&lt;br&gt;
    db, _ := sql.Open("postgres", "your_connection_string")&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;repo := &amp;amp;repository.UserRepository{DB: db}
service := &amp;amp;service.UserService{Repo: repo}
controller := &amp;amp;controller.UserController{Service: service}

http.HandleFunc("/users", controller.GetUsers)

log.Println("Server running on :8080")
http.ListenAndServe(":8080", nil)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;}&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;


---

## 🔥 What You Achieved

* Clean architecture like Laravel
* Separation of concerns
* Scalable Go backend structure

---

## 🧭 When to Use This

Use this structure when:

* Building real APIs
* Working in teams
* Scaling projects

---

## 💬 Final Thought

Go doesn’t force structure…

👉 But professionals create one.

If you combine Go performance with Laravel-style architecture, you get the best of both worlds.

---

## 🚀 Coming Next

👉 Add middleware (logging, auth)
👉 Add validation layer
👉 Dockerize Go + PostgreSQL

---

#golang #backend #architecture #programming #webdev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>🏗️ System Architecture Simplified: From Monolith to Microservices (With Real Insights)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Mon, 27 Apr 2026 11:18:50 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/system-architecture-simplified-from-monolith-to-microservices-with-real-insights-2fc9</link>
      <guid>https://dev.to/ahmedraza_fyntune/system-architecture-simplified-from-monolith-to-microservices-with-real-insights-2fc9</guid>
      <description>&lt;p&gt;When you start building applications, everything feels simple — one codebase, one database, one deployment. But as your app grows, things start breaking in subtle ways: slow performance, deployment risks, tight coupling.&lt;/p&gt;

&lt;p&gt;That’s where &lt;strong&gt;System Architecture&lt;/strong&gt; becomes critical.&lt;/p&gt;

&lt;p&gt;Let’s break it down in a practical, developer-first way.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 What is System Architecture?
&lt;/h2&gt;

&lt;p&gt;System Architecture defines:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How components interact&lt;/li&gt;
&lt;li&gt;How data flows&lt;/li&gt;
&lt;li&gt;How scalable and maintainable your system is&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it as the &lt;strong&gt;blueprint of your application&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Monolithic Architecture (Where Most of Us Start)
&lt;/h2&gt;

&lt;p&gt;In a monolith:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Everything is in one codebase&lt;/li&gt;
&lt;li&gt;One database&lt;/li&gt;
&lt;li&gt;Single deployment unit&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ✅ Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Simple to build and deploy&lt;/li&gt;
&lt;li&gt;Easy debugging (initially)&lt;/li&gt;
&lt;li&gt;Great for MVPs&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ❌ Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Hard to scale specific parts&lt;/li&gt;
&lt;li&gt;Deployment becomes risky&lt;/li&gt;
&lt;li&gt;Tight coupling across modules&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Example (Laravel App):
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Auth + Payments + Orders + Notifications → all inside one project&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 When Monolith Starts Failing
&lt;/h2&gt;

&lt;p&gt;You’ll notice:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Small changes break unrelated features&lt;/li&gt;
&lt;li&gt;Deployments take longer&lt;/li&gt;
&lt;li&gt;Scaling requires scaling everything&lt;/li&gt;
&lt;li&gt;Teams step on each other’s code&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This is the point where you rethink architecture.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Microservices Architecture
&lt;/h2&gt;

&lt;p&gt;Instead of one big app:&lt;br&gt;
👉 You split into independent services&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;Auth Service&lt;/li&gt;
&lt;li&gt;Payment Service&lt;/li&gt;
&lt;li&gt;Order Service&lt;/li&gt;
&lt;li&gt;Notification Service&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each service:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Has its own codebase&lt;/li&gt;
&lt;li&gt;Can have its own database&lt;/li&gt;
&lt;li&gt;Is deployed independently&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔹 Microservices Pros &amp;amp; Cons
&lt;/h2&gt;
&lt;h3&gt;
  
  
  ✅ Pros:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Independent scaling&lt;/li&gt;
&lt;li&gt;Faster deployments&lt;/li&gt;
&lt;li&gt;Better fault isolation&lt;/li&gt;
&lt;li&gt;Tech flexibility (Go, Node, PHP, etc.)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  ❌ Cons:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Network complexity&lt;/li&gt;
&lt;li&gt;Debugging becomes harder&lt;/li&gt;
&lt;li&gt;Requires DevOps maturity&lt;/li&gt;
&lt;li&gt;Distributed data challenges&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  🔹 Real-World Architecture Pattern
&lt;/h2&gt;

&lt;p&gt;A common modern setup:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;[ Client (Vue/React) ]
          ↓
     API Gateway
          ↓
 ┌────────┼────────┐
 ↓        ↓        ↓
Auth   Orders   Payments
Svc     Svc       Svc
 ↓        ↓        ↓
 DB       DB       DB
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🔹 Key Concepts You Must Know
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. API Gateway
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Single entry point&lt;/li&gt;
&lt;li&gt;Handles auth, routing, rate limiting&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Service Communication
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;REST (simple)&lt;/li&gt;
&lt;li&gt;gRPC (fast, efficient)&lt;/li&gt;
&lt;li&gt;Message Queues (async processing)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Database Strategy
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Shared DB ❌ (avoid)&lt;/li&gt;
&lt;li&gt;Database per service ✅&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  4. Caching Layer
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Redis for performance boost&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  5. Queue System
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Background jobs (emails, reports)&lt;/li&gt;
&lt;li&gt;Tools: Redis queues, Kafka, RabbitMQ&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔹 Monolith vs Microservices (Quick Comparison)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Monolith&lt;/th&gt;
&lt;th&gt;Microservices&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Deployment&lt;/td&gt;
&lt;td&gt;Single&lt;/td&gt;
&lt;td&gt;Independent&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scaling&lt;/td&gt;
&lt;td&gt;Full app&lt;/td&gt;
&lt;td&gt;Service-level&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Complexity&lt;/td&gt;
&lt;td&gt;Low&lt;/td&gt;
&lt;td&gt;High&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&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;h2&gt;
  
  
  🔹 What Should YOU Choose?
&lt;/h2&gt;

&lt;p&gt;👉 If you're building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MVP / Startup → &lt;strong&gt;Monolith&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Growing SaaS → &lt;strong&gt;Modular Monolith&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Large-scale system → &lt;strong&gt;Microservices&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;💡 Pro tip:&lt;br&gt;
&lt;strong&gt;Don’t jump to microservices too early. Scale your architecture only when needed.&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔹 Final Thoughts
&lt;/h2&gt;

&lt;p&gt;System architecture is not about trends — it’s about &lt;strong&gt;trade-offs&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start simple.&lt;br&gt;
Measure pain points.&lt;br&gt;
Evolve your architecture.&lt;/p&gt;

&lt;p&gt;That’s how real systems are built.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>distributedsystems</category>
      <category>programming</category>
      <category>microservices</category>
    </item>
    <item>
      <title>🚀 Building a CRUD API in Go with PostgreSQL (Step-by-Step)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Mon, 27 Apr 2026 11:09:38 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/building-a-crud-api-in-go-with-postgresql-step-by-step-2n34</link>
      <guid>https://dev.to/ahmedraza_fyntune/building-a-crud-api-in-go-with-postgresql-step-by-step-2n34</guid>
      <description>&lt;p&gt;In the previous post, we built a simple CRUD API in Go using in-memory storage.&lt;/p&gt;

&lt;p&gt;Now let’s make it &lt;strong&gt;real-world ready&lt;/strong&gt; by connecting it to a database:&lt;/p&gt;

&lt;p&gt;👉 PostgreSQL&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚙️ Step 1: Install PostgreSQL Driver
&lt;/h2&gt;

&lt;p&gt;We’ll use the official driver:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;go get github.com/lib/pq
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧱 Step 2: Setup Database Connection
&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="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s"&gt;"database/sql"&lt;/span&gt;
    &lt;span class="s"&gt;"log"&lt;/span&gt;

    &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="s"&gt;"github.com/lib/pq"&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;db&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;DB&lt;/span&gt;

&lt;span class="k"&gt;func&lt;/span&gt; &lt;span class="n"&gt;initDB&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;connStr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"user=postgres password=postgres dbname=testdb sslmode=disable"&lt;/span&gt;

    &lt;span class="k"&gt;var&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="kt"&gt;error&lt;/span&gt;
    &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sql&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Open&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"postgres"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;connStr&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;err&lt;/span&gt; &lt;span class="o"&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;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Ping&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;err&lt;/span&gt; &lt;span class="o"&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;log&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Fatal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DB not reachable:"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;log&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;"Connected to PostgreSQL ✅"&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;
  
  
  🗄️ Step 3: Create Table
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight sql"&gt;&lt;code&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;users&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;SERIAL&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt; &lt;span class="k"&gt;NOT&lt;/span&gt; &lt;span class="k"&gt;NULL&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧩 Step 4: Model
&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;type&lt;/span&gt; &lt;span class="n"&gt;User&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;ID&lt;/span&gt;   &lt;span class="kt"&gt;int&lt;/span&gt;    &lt;span class="s"&gt;`json:"id"`&lt;/span&gt;
    &lt;span class="n"&gt;Name&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="s"&gt;`json:"name"`&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  ➕ Create User (INSERT)
&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;func&lt;/span&gt; &lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&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;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&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;user&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewDecoder&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;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;QueryRow&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"INSERT INTO users(name) VALUES($1) RETURNING id"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&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;err&lt;/span&gt; &lt;span class="o"&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&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;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&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="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;user&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;
  
  
  📥 Get Users (SELECT)
&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;func&lt;/span&gt; &lt;span class="n"&gt;getUsers&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&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;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"SELECT id, name FROM users"&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;err&lt;/span&gt; &lt;span class="o"&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&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;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&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="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;defer&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Close&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;users&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="n"&gt;User&lt;/span&gt;

    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Next&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;user&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
        &lt;span class="n"&gt;rows&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Scan&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ID&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="n"&gt;users&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;users&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;
  
  
  ✏️ Update User
&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;func&lt;/span&gt; &lt;span class="n"&gt;updateUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&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;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;idParam&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;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&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;"id"&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;user&lt;/span&gt; &lt;span class="n"&gt;User&lt;/span&gt;
    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewDecoder&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;Body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="s"&gt;"UPDATE users SET name=$1 WHERE id=$2"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idParam&lt;/span&gt;&lt;span class="p"&gt;,&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;err&lt;/span&gt; &lt;span class="o"&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&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;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&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="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Updated"&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;
  
  
  ❌ Delete User
&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;func&lt;/span&gt; &lt;span class="n"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&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;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;idParam&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;URL&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Query&lt;/span&gt;&lt;span class="p"&gt;()&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;"id"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;err&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Exec&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"DELETE FROM users WHERE id=$1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;idParam&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;err&lt;/span&gt; &lt;span class="o"&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&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;err&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Error&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="k"&gt;return&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="n"&gt;json&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;NewEncoder&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="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Deleted"&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;
  
  
  🌐 Step 5: Main Function
&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;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;initDB&lt;/span&gt;&lt;span class="p"&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;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;getUsers&lt;/span&gt;&lt;span class="p"&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;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/create"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;createUser&lt;/span&gt;&lt;span class="p"&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;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/update"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;updateUser&lt;/span&gt;&lt;span class="p"&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;HandleFunc&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/delete"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="n"&gt;log&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;"Server running on :8080"&lt;/span&gt;&lt;span class="p"&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;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧪 Test API
&lt;/h2&gt;

&lt;p&gt;Same as before, but now data is stored in PostgreSQL 🎉&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Improvements You Should Do Next
&lt;/h2&gt;

&lt;p&gt;This is still beginner-level. To make it production-ready:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Use environment variables for DB config&lt;/li&gt;
&lt;li&gt;Add validation&lt;/li&gt;
&lt;li&gt;Use a router (Chi / Gorilla Mux)&lt;/li&gt;
&lt;li&gt;Structure code (controllers, services, repo)&lt;/li&gt;
&lt;li&gt;Add connection pooling tuning&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔥 What You Learned
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Connecting Go to PostgreSQL&lt;/li&gt;
&lt;li&gt;Executing SQL queries (&lt;code&gt;INSERT&lt;/code&gt;, &lt;code&gt;SELECT&lt;/code&gt;, &lt;code&gt;UPDATE&lt;/code&gt;, &lt;code&gt;DELETE&lt;/code&gt;)&lt;/li&gt;
&lt;li&gt;Handling real database-backed APIs&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🚀 Coming Next
&lt;/h2&gt;

&lt;p&gt;👉 Proper API structure in Go (like Laravel mindset)&lt;br&gt;
👉 Using Docker with Go + PostgreSQL&lt;br&gt;
👉 Adding authentication (JWT)&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;Now you're no longer just learning Go…&lt;/p&gt;

&lt;p&gt;👉 You're building backend systems.&lt;/p&gt;




</description>
      <category>webdev</category>
      <category>programming</category>
      <category>go</category>
      <category>ai</category>
    </item>
    <item>
      <title>🔥 Arrays vs Slices in Go (Explained in the Simplest Way)</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:10:21 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/arrays-vs-slices-in-go-explained-in-the-simplest-way-48ca</link>
      <guid>https://dev.to/ahmedraza_fyntune/arrays-vs-slices-in-go-explained-in-the-simplest-way-48ca</guid>
      <description>&lt;p&gt;If you just started learning Go, one thing will confuse you quickly:&lt;/p&gt;

&lt;p&gt;👉 Arrays vs Slices&lt;/p&gt;

&lt;p&gt;They look similar… but behave very differently.&lt;/p&gt;

&lt;p&gt;Let’s break it down in the simplest way possible 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  📦 What is an Array?
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;array&lt;/strong&gt; is a fixed-size collection.&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;numbers&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&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;1&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="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Size is &lt;strong&gt;fixed&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Cannot grow or shrink&lt;/li&gt;
&lt;li&gt;Rarely used in real-world Go apps&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔄 What is a Slice?
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;slice&lt;/strong&gt; is a dynamic version of an array.&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;numbers&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;1&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="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Key points:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Size is &lt;strong&gt;dynamic&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Can grow using &lt;code&gt;append&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Used &lt;strong&gt;almost everywhere in Go&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚡ Adding Data (Only Works with Slice)
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&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;1&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="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="n"&gt;numbers&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;numbers&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Now:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧠 Under the Hood (Important Concept)
&lt;/h2&gt;

&lt;p&gt;A slice is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pointer to an array&lt;/li&gt;
&lt;li&gt;Length&lt;/li&gt;
&lt;li&gt;Capacity&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Think of it like:&lt;br&gt;
👉 “A flexible view on top of an array”&lt;/p&gt;


&lt;h2&gt;
  
  
  🔍 Slice Example with Capacity
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;numbers&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="kt"&gt;int&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="m"&gt;5&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="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// 2&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="nb"&gt;cap&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;numbers&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c"&gt;// 5&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  ❗ Common Mistake
&lt;/h2&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;arr&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="m"&gt;3&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;1&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="m"&gt;3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="n"&gt;arr&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;arr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="m"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;// ❌ ERROR&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;Why?&lt;br&gt;
👉 Because arrays are fixed size&lt;/p&gt;


&lt;h2&gt;
  
  
  🔥 Real-World Use Case
&lt;/h2&gt;

&lt;p&gt;When building APIs:&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;users&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;users&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Ahmed"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;users&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;users&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"John"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Dynamic data = slices ✅&lt;/p&gt;




&lt;h2&gt;
  
  
  🧭 When to Use What?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Feature&lt;/th&gt;
&lt;th&gt;Array&lt;/th&gt;
&lt;th&gt;Slice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Size&lt;/td&gt;
&lt;td&gt;Fixed&lt;/td&gt;
&lt;td&gt;Dynamic&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Usage&lt;/td&gt;
&lt;td&gt;Rare&lt;/td&gt;
&lt;td&gt;Common&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Flexibility&lt;/td&gt;
&lt;td&gt;❌&lt;/td&gt;
&lt;td&gt;✅&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;👉 In 95% of cases → use &lt;strong&gt;slice&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;If you understand slices, you understand &lt;strong&gt;how Go manages data internally&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;This is a foundational concept—don’t skip it.&lt;/p&gt;




&lt;h2&gt;
  
  
  🚀 Coming Next
&lt;/h2&gt;

&lt;p&gt;Next post:&lt;br&gt;
👉 Structs in Go (this is where real backend modeling starts)&lt;/p&gt;




&lt;h1&gt;
  
  
  golang #backend #programming #webdev #devto
&lt;/h1&gt;

</description>
      <category>go</category>
      <category>webdev</category>
      <category>programming</category>
      <category>ai</category>
    </item>
    <item>
      <title>🚀 Getting Started with Go (Golang) for Backend Developers</title>
      <dc:creator>Ahmed Raza Idrisi</dc:creator>
      <pubDate>Wed, 22 Apr 2026 17:07:57 +0000</pubDate>
      <link>https://dev.to/ahmedraza_fyntune/getting-started-with-go-golang-for-backend-developers-4lpp</link>
      <guid>https://dev.to/ahmedraza_fyntune/getting-started-with-go-golang-for-backend-developers-4lpp</guid>
      <description>&lt;p&gt;If you're coming from PHP, Node.js, or Laravel, learning Go can feel different—but in a good way.&lt;/p&gt;

&lt;p&gt;Go is designed for &lt;strong&gt;performance, simplicity, and concurrency&lt;/strong&gt;. Many modern systems use it for building fast APIs and scalable services.&lt;/p&gt;

&lt;p&gt;Let’s understand it in a simple way 👇&lt;/p&gt;




&lt;h2&gt;
  
  
  🧠 What is Go?
&lt;/h2&gt;

&lt;p&gt;Go (or Golang) is a &lt;strong&gt;compiled programming language&lt;/strong&gt; created at Google.&lt;/p&gt;

&lt;p&gt;Think of it like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;⚡ Faster than PHP/Node (compiled)&lt;/li&gt;
&lt;li&gt;🧼 Cleaner syntax than Java&lt;/li&gt;
&lt;li&gt;🔁 Built for concurrency (handling multiple tasks efficiently)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  ⚙️ Your First Go Program
&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="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;Println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World!"&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;h3&gt;
  
  
  What’s happening?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;package main&lt;/code&gt; → entry point&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;import "fmt"&lt;/code&gt; → used for printing&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;func main()&lt;/code&gt; → main function where execution starts&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🔤 Variables in Go
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight go"&gt;&lt;code&gt;&lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="s"&gt;"Ahmed"&lt;/span&gt;
&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="o"&gt;:=&lt;/span&gt; &lt;span class="m"&gt;25&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No need to write types explicitly (Go infers them).&lt;/p&gt;




&lt;h2&gt;
  
  
  🔁 Loops (Only ONE loop in Go)
&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;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;5&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;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="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Simple and clean.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚡ Functions
&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;func&lt;/span&gt; &lt;span class="n"&gt;add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&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;b&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;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;a&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  🧵 Concurrency (This is where Go shines)
&lt;/h2&gt;

&lt;p&gt;Go uses &lt;strong&gt;goroutines&lt;/strong&gt; (lightweight threads):&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;span class="k"&gt;func&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;"Running in background"&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;h3&gt;
  
  
  Why this matters:
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Handle multiple API requests easily&lt;/li&gt;
&lt;li&gt;Build high-performance systems&lt;/li&gt;
&lt;li&gt;Perfect for microservices&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🌐 Simple API in Go
&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="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="s"&gt;"net/http"&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;handler&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;w&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;ResponseWriter&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Request&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;Fprintf&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="s"&gt;"Hello from Go API"&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;http&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;HandleFunc&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="n"&gt;handler&lt;/span&gt;&lt;span class="p"&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;ListenAndServe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;":8080"&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;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Run it and open:&lt;br&gt;
👉 &lt;a href="http://localhost:8080" rel="noopener noreferrer"&gt;http://localhost:8080&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  🔥 Why You Should Learn Go
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;High performance (close to C++)&lt;/li&gt;
&lt;li&gt;Simple syntax&lt;/li&gt;
&lt;li&gt;Great for backend + APIs&lt;/li&gt;
&lt;li&gt;Used by companies like Google, Uber, Netflix&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  🧭 Coming Next
&lt;/h2&gt;

&lt;p&gt;In upcoming posts, I’ll cover:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Building REST APIs in Go&lt;/li&gt;
&lt;li&gt;Connecting Go with PostgreSQL&lt;/li&gt;
&lt;li&gt;Using Go with Docker&lt;/li&gt;
&lt;li&gt;Concurrency deep dive (goroutines + channels)&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  💬 Final Thought
&lt;/h2&gt;

&lt;p&gt;If you already know backend development, Go will feel like a &lt;strong&gt;power upgrade&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Start small. Stay consistent. Share what you learn.&lt;/p&gt;




&lt;h1&gt;
  
  
  golang #backend #programming #webdev #devto
&lt;/h1&gt;

</description>
      <category>go</category>
      <category>programming</category>
      <category>webdev</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
