{"id":14367,"date":"2026-08-26T19:02:49","date_gmt":"2026-08-26T13:32:49","guid":{"rendered":"https:\/\/www.scaler.com\/blog\/?p=14367"},"modified":"2026-08-26T19:03:04","modified_gmt":"2026-08-26T13:33:04","slug":"golang-projects-to-build","status":"publish","type":"post","link":"https:\/\/www.scaler.com\/blog\/golang-projects-to-build\/","title":{"rendered":"12 Golang Projects to Build That Show Employers You&#8217;re Production-Ready"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Have you ever looked at a classmate\u2019s or colleague\u2019s GitHub and realised you\u2019re building almost the same golang projects? You\u2019d be surprised to know how often this happens. A URL shortener, a chat app, a to-do list are great ways to practice Go, but when several candidates have the same projects, the project name alone does little to show what you can actually build.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That doesn\u2019t mean you need increasingly unusual golang project ideas. You just need the kind of golang projects that give you something concrete to talk about. The 12 go projects below are laid out as practical specs, with what to build, why Go fits, the packages to consider, realistic build times, and what an interviewer can learn from the result.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you\u2019re still working through Go fundamentals, then you can start with the complete <a href=\"https:\/\/www.scaler.com\/blog\/golang-roadmap-2026-complete-guide-to-learning-go\/\">Golang roadmap<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"what-golang-is-actually-used-for-and-why-it-changes-what-you-should-build\"><\/span><strong>What Golang Is Actually Used For (and Why It Changes What You Should Build)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you\u2019re choosing golang projects for your portfolio, you should always start by asking yourself one question: \u201cDoes this project really require Go to build it?\u201d Go is widely used for API services, command-line tools, and cloud infrastructure. So, when you keep these use cases in mind while choosing a project, you have more opportunities to show what Go is genuinely good at and where it is best used.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If your project would be just as natural to build in Python or Java, it is not really a Go project; it is a project that happens to compile with go build. So, you should look for projects where Go can give you something meaningful to work with, whether that is concurrent I\/O, network services, throughput, simple deployment, or systems-level control.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That is also why Go is mostly not the preferred choice for data science, ML, heavy UI development, or quick CRUD prototypes. If you\u2019re coming from Java or Python, consider Go only when you want to work on concurrent network services, infrastructure, or tools with simple deployment. Java has a broader enterprise ecosystem, while Python is used for data and rapid development. You can also look at how Go compares with other programming languages for jobs before deciding where to focus.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can also read about the <a href=\"https:\/\/www.scaler.com\/blog\/best-programming-languages-to-learn-for-jobs\/\">best programming languages to learn for jobs<\/a> if you want to understand the broader hiring aspect.<\/p>\n\n\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>Scaler Carousel<\/title>\n\n<!-- Plus Jakarta Sans Font -->\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Plus+Jakarta+Sans:wght@400;500;600;700&amp;display=swap\" rel=\"stylesheet\">\n<!-- Swiper CSS -->\n<link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n\n<style>\n.scaler-carousel {\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  max-width: 900px;\n  margin: 24px auto;\n  padding: 0;\n  box-sizing: border-box;\n}\n.scaler-carousel *,\n.scaler-carousel *::before,\n.scaler-carousel *::after {\n  box-sizing: border-box;\n}\n\n\/* Header *\/\n.scaler-header {\n  text-align: center;\n  margin-bottom: 20px;\n}\n.scaler-header-title {\n  font-size: 22px;\n  font-weight: 700;\n  color: #1a1a2e;\n  margin: 0 0 6px;\n  line-height: 1.2;\n}\n.scaler-header-subtitle {\n  font-size: 14px;\n  color: #6b7280;\n  margin: 0;\n  font-weight: 500;\n}\n\n\/* Swiper *\/\n.swiper.scaler-swiper {\n  padding-bottom: 48px;\n}\n.scaler-swiper .swiper-slide {\n  height: auto;\n  display: flex;\n  align-items: stretch;\n}\n\/* Navigation arrows \u2014 styled to match the topics HorizontalScroll controls *\/\n.scaler-swiper .swiper-button-next,\n.scaler-swiper .swiper-button-prev {\n  width: 46px;\n  height: 46px;\n  border-radius: 8px;\n  background: #ffffff;\n  box-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n  top: calc(50% - 24px); \/* centre on the cards, ignoring the pagination space below *\/\n  transform: translateY(-50%);\n  margin-top: 0;\n}\n.scaler-swiper .swiper-button-prev { left: 10px; }\n.scaler-swiper .swiper-button-next { right: 10px; }\n\/* hide Swiper's default font-icon arrow and draw the topics chevron via a mask *\/\n.scaler-swiper .swiper-button-next::after,\n.scaler-swiper .swiper-button-prev::after {\n  content: \"\";\n  width: 20px;\n  height: 20px;\n  background-color: #61738e;\n  -webkit-mask: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 32 32'%3E%3Cpath d='M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z'\/%3E%3C\/svg%3E\") no-repeat center \/ contain;\n  mask: url(\"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' viewBox='0 0 32 32'%3E%3Cpath d='M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z'\/%3E%3C\/svg%3E\") no-repeat center \/ contain;\n}\n.scaler-swiper .swiper-button-prev::after { transform: rotate(-90deg); }\n.scaler-swiper .swiper-button-next::after { transform: rotate(90deg); }\n.scaler-swiper .swiper-button-disabled {\n  opacity: 0.35;\n  pointer-events: none;\n}\n.scaler-swiper .swiper-pagination-bullet-active {\n  background: #255aad;\n}\n\n\/* Card *\/\n.scaler-card {\n  display: flex;\n  flex-direction: column;\n  gap: 14px;\n  width: 100%;\n  background: #ffffff;\n  border: 1px solid #e5e7eb;\n  border-radius: 16px;\n  padding: 24px;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);\n  transition: box-shadow 0.2s ease;\n}\n.scaler-card:hover {\n  box-shadow: 0 6px 16px rgba(0, 0, 0, 0.10);\n}\n\n\/* NSDC badge *\/\n.scaler-badge {\n  display: inline-flex;\n  align-items: center;\n  align-self: flex-start;\n  background: #f3f4f6;\n  color: #111827;\n  font-size: 12px;\n  font-weight: 600;\n  padding: 4px 10px;\n  border-radius: 20px;\n  white-space: nowrap;\n  letter-spacing: 0.1px;\n}\n\n\/* Top: icon + title + description *\/\n.scaler-card-top {\n  display: flex;\n  align-items: flex-start;\n  gap: 12px;\n  min-height: 100px;\n}\n.scaler-icon-wrap {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 64px;\n  height: 64px;\n  border-radius: 12px;\n  background: #f3f4f6;\n  color: #374151;\n  flex-shrink: 0;\n}\n.scaler-icon-wrap svg {\n  width: 26px;\n  height: 26px;\n}\n.scaler-card-top-content {\n  flex: 1;\n  min-width: 0;\n  display: flex;\n  flex-direction: column;\n  gap: 5px;\n}\n.scaler-title {\n  font-size: 16px;\n  font-weight: 700;\n  color: #111827;\n  margin: 0;\n  line-height: 1.35;\n}\n.scaler-desc {\n  font-size: 13px;\n  color: #6b7280;\n  margin: 0;\n  line-height: 1.45;\n}\n\n\/* Stats row *\/\n.scaler-stats {\n  display: flex;\n  border-top: 1px solid #e5e7eb;\n  border-bottom: 1px solid #e5e7eb;\n  padding: 12px 0;\n}\n.scaler-stat {\n  display: flex;\n  flex-direction: column;\n  align-items: center;\n  gap: 2px;\n  flex: 1;\n  min-width: 0;\n  text-align: center;\n}\n.scaler-stat:not(:last-child) {\n  border-right: 1px solid #d1d5db;\n}\n.scaler-stat-value {\n  font-size: 14px;\n  font-weight: 700;\n  color: #111827;\n  white-space: nowrap;\n}\n.scaler-stat-label {\n  font-size: 12px;\n  color: #9ca3af;\n}\n\n\/* Company logos *\/\n.scaler-logos {\n  display: flex;\n  align-items: center;\n  gap: 12px;\n  flex-wrap: nowrap;\n}\n.scaler-company-logo {\n  height: 20px !important;\n  width: auto !important;\n  max-width: 70px;\n  object-fit: contain;\n  display: inline-block;\n}\n.scaler-logo-more {\n  font-size: 12px;\n  color: #9ca3af;\n  white-space: nowrap;\n}\n.scaler-logo-strip {\n  display: block;\n  width: 100% !important;\n  max-width: 100%;\n  min-width: 0;\n  height: auto !important;\n  object-fit: contain;\n}\n\n\/* CTA *\/\n.scaler-card-btns {\n  margin-top: auto;\n}\n.scaler-card-btns button {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n  width: 100%;\n  padding: 12px 16px;\n  border: none;\n  border-radius: 10px;\n  background-color: #255aad;\n  color: #ffffff;\n  font-family: 'Plus Jakarta Sans', sans-serif;\n  font-size: 14px;\n  font-weight: 600;\n  cursor: pointer;\n  text-decoration: none;\n  transition: opacity 0.15s ease;\n}\n.scaler-card-btns button:hover,\n.scaler-card-btns button:focus {\n  opacity: 0.88;\n  color: #ffffff;\n}\n.scaler-card-btns button svg {\n  flex-shrink: 0;\n}\n\n@media (max-width: 1000px) {\n  .scaler-carousel { max-width: 96vw; }\n}\n<\/style>\n\n\n<div class=\"scaler-carousel\">\n  <div class=\"scaler-header\">\n    <h2 class=\"scaler-header-title\"><span class=\"ez-toc-section\" id=\"transform-your-career\"><\/span>Transform Your Career<span class=\"ez-toc-section-end\"><\/span><\/h2>\n    <p class=\"scaler-header-subtitle\">Choose from our industry-leading programs designed for career success<\/p>\n  <\/div>\n\n  <div class=\"swiper scaler-swiper\">\n    <div class=\"swiper-wrapper\">\n\n      <!-- CARD 1 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><polyline points=\"16 18 22 12 16 6\"\/><polyline points=\"8 6 2 12 8 18\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Modern Software and AI Engineering Program<\/h3>\n              <p class=\"scaler-desc\">Master full-stack development with AI integration<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/academy\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 2 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><ellipse cx=\"12\" cy=\"5\" rx=\"9\" ry=\"3\"\/><path d=\"M3 5v14c0 1.66 4.03 3 9 3s9-1.34 9-3V5\"\/><path d=\"M3 12c0 1.66 4.03 3 9 3s9-1.34 9-3\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Modern Data Science and ML with specialisation in AI<\/h3>\n              <p class=\"scaler-desc\">Advanced data science techniques with AI specialization<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/data-science-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 3 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2L13.5 8.5L20 10L13.5 11.5L12 18L10.5 11.5L4 10L10.5 8.5L12 2Z\"\/><\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">Advanced AIML with Specialisation in Agentic AI<\/h3>\n              <p class=\"scaler-desc\">Deep dive into AIML with focus on Agentic systems<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/ai-machine-learning-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 4 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <path d=\"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z\" \/>\n                <path d=\"M9.2 15.2a3 3 0 1 0 4.24-4.24\" \/>\n              <\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">DevOps, Cloud &#038; AI Platform Engineering<\/h3>\n              <p class=\"scaler-desc\">Build and manage AI-powered cloud infrastructure<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">12 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/2\/2f\/Google_2015_logo.svg\" alt=\"Google\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/a\/a9\/Amazon_logo.svg\" alt=\"Amazon\" loading=\"lazy\">\n            <img decoding=\"async\" class=\"scaler-company-logo\" src=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/4\/42\/Paytm_logo.png\" alt=\"Paytm\" loading=\"lazy\">\n            <span class=\"scaler-logo-more\">+1000 more<\/span>\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/devops-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- CARD 5 -->\n      <div class=\"swiper-slide\">\n        <div class=\"scaler-card\">\n          <div class=\"scaler-badge\">NSDC Certified<\/div>\n          <div class=\"scaler-card-top\">\n            <div class=\"scaler-icon-wrap\">\n              <svg width=\"26\" height=\"26\" viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                <line x1=\"3\" y1=\"22\" x2=\"21\" y2=\"22\" \/>\n                <line x1=\"6\" y1=\"18\" x2=\"6\" y2=\"11\" \/>\n                <line x1=\"10\" y1=\"18\" x2=\"10\" y2=\"11\" \/>\n                <line x1=\"14\" y1=\"18\" x2=\"14\" y2=\"11\" \/>\n                <line x1=\"18\" y1=\"18\" x2=\"18\" y2=\"11\" \/>\n                <polygon points=\"12 2 20 7 4 7\" \/>\n              <\/svg>\n            <\/div>\n            <div class=\"scaler-card-top-content\">\n              <h3 class=\"scaler-title\">AI Engineering Advanced Certification by IIT-Roorkee<\/h3>\n              <p class=\"scaler-desc\">Premier AI engineering certification from IIT-Roorkee<\/p>\n            <\/div>\n          <\/div>\n          <div class=\"scaler-stats\">\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">3 Months<\/span><span class=\"scaler-stat-label\">Duration<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">AI-Led<\/span><span class=\"scaler-stat-label\">Curriculum<\/span><\/div>\n            <div class=\"scaler-stat\"><span class=\"scaler-stat-value\">Career Support<\/span><span class=\"scaler-stat-label\">Support<\/span><\/div>\n          <\/div>\n          <div class=\"scaler-logos\">\n            <img decoding=\"async\" class=\"scaler-logo-strip\" src=\"https:\/\/scaler-blog-prod-wp-content.s3.ap-south-1.amazonaws.com\/wp-content\/uploads\/2026\/07\/08135139\/iitr-icons-strip.png\" alt=\"Program highlights\" loading=\"lazy\">\n          <\/div>\n          <div class=\"scaler-card-btns\">\n            <button onclick=\"window.open('https:\/\/www.scaler.com\/iit-roorkee-advanced-ai-engineering-course\/', '_blank')\">\n              Go to Program\n              <svg width=\"14\" height=\"14\" viewBox=\"0 0 16 16\" fill=\"none\" aria-hidden=\"true\"><path d=\"M3 8H13M13 8L9 4M13 8L9 12\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg>\n            <\/button>\n          <\/div>\n        <\/div>\n      <\/div>\n\n      <!-- Continue for remaining cards (6\u20138) using same pattern -->\n\n    <\/div>\n    <div class=\"swiper-button-next\"><\/div>\n    <div class=\"swiper-button-prev\"><\/div>\n    <div class=\"swiper-pagination\"><\/div>\n  <\/div>\n<\/div>\n\n<!-- Swiper.js -->\n<script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n<script>\ndocument.addEventListener(\"DOMContentLoaded\", function () {\n  const pathParts = window.location.pathname.split(\"\/\").filter(Boolean);\n  const slug = pathParts[pathParts.length - 1] || \"\";\n  const readableSlug = encodeURIComponent(slug);\n  const buttons = document.querySelectorAll(\".scaler-card-btns button\");\n\n  buttons.forEach((btn) => {\n    const baseURL = btn.getAttribute(\"onclick\").match(\/'(.*?)'\/)[1];\n    if (!baseURL.includes(\"utm_source=\")) {\n      const separator = baseURL.includes(\"?\") ? \"&\" : \"?\";\n      const updatedURL = `${baseURL}${separator}utm_source=blog&utm_medium=program_carousel&utm_content=${readableSlug}`;\n      btn.setAttribute(\"onclick\", `window.open('${updatedURL}', '_blank')`);\n    }\n  });\n\n  new Swiper(\".scaler-swiper\", {\n    slidesPerView: 1,\n    spaceBetween: 28,\n    grabCursor: true,\n    navigation: { nextEl: \".swiper-button-next\", prevEl: \".swiper-button-prev\" },\n    pagination: { el: \".swiper-pagination\", dynamicBullets: true, clickable: true },\n    breakpoints: { 1000: { slidesPerView: 2 } },\n    keyboard: { enabled: true },\n  });\n});\n<\/script>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"how-to-use-this-list-tiers-time-and-how-many-you-actually-need\"><\/span><strong>How to Use This List (Tiers, Time, and How Many You Actually Need)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">We\u2019ve divided the list into three tiers based on the depth of Go involved:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Tier 1:<\/strong> Foundations: Use Go\u2019s standard library to build complete applications. Plan for 1-2 weeks per project.<\/li>\n\n\n\n<li><strong>Tier 2:<\/strong> Concurrency: Work with goroutines, channels, cancellation, synchronization, and concurrent I\/O. Plan for 2-3 weeks per project.<\/li>\n\n\n\n<li><strong>Tier 3:<\/strong> Systems &amp; Infra: Work on networking, distributed components, performance, or infrastructure. Plan for 3-5 weeks per project.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The timelines assume 8-10 focused hours a week alongside a job. You can pick one project from each tier and take each through testing, error handling, logging, deployment, and the other production details covered later in the article. Three finished projects are enough to demonstrate a range of Go skills; you don&#8217;t need to complete the entire list.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You\u2019ll also find golang projects with source code online. Use existing implementations when you get stuck or want to understand another approach, but don\u2019t copy them into your repository. Use existing implementations when you need to understand an approach or get past a blocker, but don&#8217;t copy them into your repository. You must work on the implementation yourself so you can explain the decisions, change the code, and answer questions about it in an interview.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-1-foundation-projects-golang-projects-for-beginners\"><\/span><strong>Tier 1: Foundation Projects (Golang Projects for Beginners)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first four golang projects for beginners that we have covered here focus on the parts of Go you\u2019ll use in everyday backend and CLI development. You\u2019ll work with the standard library, HTTP, files, APIs, and basic data handling while building projects that can be completed without jumping straight into distributed systems or advanced concurrency. These beginner Golang projects can help you get started if you already know the basics of Go and want to turn them into working applications. Each one also leaves room to add testing, error handling, logging, and other production practices as you build it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>1. A CLI Task Manager with Persistent Storage<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a todo add \/ list \/ done \/ rm command-line tool with subcommands, flags, and either JSON or SQLite persistence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> CLI tools are one of Go&#8217;s common use cases, particularly when you want to compile the application into a single binary with no runtime dependencies. You can even cross-compile it, such as using GOOS=darwin go build to create a macOS binary from a Linux machine.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Beginner<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> flag, encoding\/json, os, errors; use spf13\/cobra for richer subcommands or mattn\/go-sqlite3 for SQLite persistence.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 1 week<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> Organising a Go module with cmd\/ and internal\/, handling and wrapping errors instead of relying on panic, and building a binary that someone else can run.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">We\u2019re keeping this one to-do app in the list because the focus here is to have the chance to build a CLI in Go and see how a Go application can be compiled into a single binary that others can run.<\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        \/* topics design tokens (variables.scss) *\/\n        --scaler-primary: #005bb3;          \/* primary-color-80 *\/\n        --scaler-primary-30: #8acaff;       \/* primary-color-30 *\/\n        --scaler-brand-blue: #255aad;\n        --scaler-live: #ee001d;             \/* accent-v5-60 *\/\n        --scaler-live-bg: #ffe6e9;          \/* accent-v5-10 *\/\n        --scaler-card-bg: #ffffff;          \/* neutral-scale-0 *\/\n        --scaler-surface: #f4f6f9;          \/* neutral-scale-2 *\/\n        --scaler-text-primary: #1a2c47;     \/* neutral-scale-12 *\/\n        --scaler-text-secondary: #61738e;   \/* neutral-scale-9 *\/\n        --scaler-border: #d6dee5;           \/* neutral-scale-4 *\/\n        --scaler-radius: 16px;\n        --scaler-radius-sm: 8px;\n        --scaler-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-events-carousel * { box-sizing: border-box; }\n\n      .scaler-events-carousel {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        position: relative;\n        width: 100%;\n      }\n      .scaler-events-carousel__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Header \u2014 calendar icon + \"Live Masterclasses\" *\/\n      .scaler-events-header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: 8px;\n        padding: 8px 0;\n      }\n      .scaler-events-header__icon { display: inline-flex; color: var(--scaler-text-primary); }\n      .scaler-events-header__icon svg { width: 24px; height: 24px; }\n      .scaler-events-header__title {\n        font-size: 18px;\n        font-weight: 700;\n        color: var(--scaler-text-primary);\n        line-height: 1.3;\n        margin: 0;\n      }\n\n      \/* Swiper wrap (holds side arrows) *\/\n      .scaler-events-swiper-wrap { position: relative; }\n      .scaler-events-carousel .swiper { width: 100%; padding: 4px; }\n      .scaler-event-swiper .swiper-slide {\n        width: 296px;          \/* topics card_container width *\/\n        height: auto;\n        display: flex;\n      }\n\n      \/* Event Card \u2014 matches topics EventCard *\/\n      .scaler-event-card {\n        background: var(--scaler-card-bg);\n        border: 1px solid var(--scaler-border);\n        border-radius: var(--scaler-radius);\n        padding: 16px;\n        display: flex;\n        flex-direction: column;\n        height: 100%;\n        width: 100%;\n        cursor: pointer;\n      }\n\n      \/* Header row: headshot + title\/name *\/\n      .scaler-event-card__header { display: flex; align-items: flex-start; }\n      .scaler-event-card__image-wrapper {\n        position: relative;\n        width: 88px;\n        height: 88px;\n        min-width: 88px;\n        border-radius: var(--scaler-radius-sm);\n        overflow: hidden;\n        background: var(--scaler-primary-30);\n      }\n      .scaler-event-card__image {\n        position: absolute;\n        top: 0; left: 0;\n        width: 100%; height: 100%;\n        object-fit: cover;\n      }\n      \/* attendee-count footer (default) *\/\n      .scaler-event-card__img-footer {\n        position: absolute;\n        left: 0; right: 0; bottom: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 4px;\n        padding: 1px 8px;\n        background: var(--scaler-surface);\n        color: var(--scaler-text-primary);\n        font-size: 13px;\n        line-height: 22px;\n      }\n      .scaler-event-card__img-footer svg { width: 14px; height: 14px; }\n      \/* live chip (shown when status === current) *\/\n      .scaler-event-card__live-badge {\n        position: absolute;\n        left: 0; right: 0; bottom: 0;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 5px;\n        padding: 1px 8px;\n        background: var(--scaler-live-bg);\n        color: var(--scaler-live);\n        font-size: 12px;\n        line-height: 22px;\n        text-transform: uppercase;\n        letter-spacing: 0.18em;\n      }\n      .scaler-event-card__live-badge::before {\n        content: \"\";\n        width: 6px; height: 6px;\n        background: var(--scaler-live);\n        border-radius: 50%;\n      }\n      .scaler-event-card__text { margin-left: 16px; min-width: 0; }\n      .scaler-event-card__title {\n        font-size: 20px;\n        font-weight: 600;\n        color: var(--scaler-text-primary);\n        margin: 0;\n        line-height: 1.4;\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n      }\n      .scaler-event-card__speaker {\n        margin-top: 8px;\n        font-size: 14px;\n        line-height: 1.4;\n        color: var(--scaler-text-primary);\n      }\n\n      \/* Takeaways *\/\n      .scaler-event-card__takeaways {\n        margin-top: 12px;\n        min-height: 50px;\n        max-height: 50px;\n        overflow: hidden;\n      }\n      .scaler-event-card__takeaway-item {\n        display: flex;\n        align-items: flex-start;\n        gap: 6px;\n      }\n      .scaler-event-card__dot {\n        width: 4px; height: 4px;\n        min-width: 4px;\n        border-radius: 50%;\n        background: var(--scaler-text-secondary);\n        margin-top: 11px;\n      }\n      .scaler-event-card__takeaway-text {\n        flex: 1;\n        min-width: 0;\n        font-size: 14px;\n        line-height: 24px;\n        color: var(--scaler-text-primary);\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-event-card__knowmore,\n      .scaler-event-card__knowmore:link,\n      .scaler-event-card__knowmore:visited {\n        flex-shrink: 0;\n        font-size: 14px;\n        line-height: 24px;\n        color: var(--scaler-primary) !important;\n        text-decoration: none;\n        white-space: nowrap;\n      }\n      .scaler-event-card__knowmore:hover { text-decoration: underline; }\n\n      \/* Date + duration *\/\n      .scaler-event-card__meta {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        margin-top: 20px;\n        font-size: 13px;\n        line-height: 24px;\n        color: var(--scaler-text-primary);\n      }\n      .scaler-event-card__duration {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n      }\n      .scaler-event-card__duration svg { width: 15px; height: 15px; }\n\n      .scaler-event-card__spacer { flex-grow: 1; min-height: 4px; }\n\n      \/* CTA \u2014 outlined \"Register with 1-Click\" *\/\n      .scaler-event-card__cta,\n      .scaler-event-card__cta:link,\n      .scaler-event-card__cta:visited {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        width: 100%;\n        margin-top: 16px;\n        padding: 8px;\n        background: transparent;\n        color: var(--scaler-primary) !important;\n        font-family: inherit;\n        font-size: 14px;\n        font-weight: 600;\n        line-height: 24px;\n        text-decoration: none;\n        border: 1px solid var(--scaler-primary);\n        border-radius: var(--scaler-radius-sm);\n        cursor: pointer;\n        transition: background 0.2s ease, color 0.2s ease;\n      }\n      .scaler-event-card__cta:hover,\n      .scaler-event-card__cta:focus {\n        background: var(--scaler-primary);\n        color: #fff !important;\n      }\n\n      \/* Side navigation arrows *\/\n      .scaler-events-nav__btn {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important;\n        height: 46px !important;\n        min-width: 46px;\n        display: flex !important;\n        align-items: center;\n        justify-content: center;\n        padding: 0 !important;\n        background: var(--scaler-card-bg) !important;\n        border: none !important;\n        border-radius: var(--scaler-radius-sm) !important;\n        box-shadow: var(--scaler-shadow) !important;\n        color: var(--scaler-text-secondary) !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-nav-prev { left: 8px !important; }\n      .scaler-nav-next { right: 8px !important; }\n      .scaler-events-nav__btn svg {\n        width: 20px !important;\n        height: 20px !important;\n        fill: var(--scaler-text-secondary) !important;\n      }\n      .scaler-events-nav__btn.swiper-button-disabled {\n        opacity: 0;\n        visibility: hidden;\n        pointer-events: none;\n      }\n\n      \/* View All Events *\/\n      .scaler-events-viewall,\n      .scaler-events-viewall:link,\n      .scaler-events-viewall:visited {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        gap: 6px;\n        margin-top: 12px;\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--scaler-brand-blue) !important;\n        text-decoration: none;\n      }\n      .scaler-events-viewall:hover { text-decoration: underline; }\n      .scaler-events-viewall svg { width: 16px; height: 16px; fill: var(--scaler-brand-blue); }\n\n      \/* hide swiper defaults *\/\n      .scaler-events-pagination { display: none; }\n      .scaler-events-carousel .swiper-button-prev,\n      .scaler-events-carousel .swiper-button-next { display: none; }\n\n      \/* Skeleton & Empty States *\/\n      .scaler-event-card--skeleton { pointer-events: none; }\n      .scaler-event-card--skeleton .scaler-event-card__image-wrapper,\n      .scaler-event-card--skeleton .scaler-event-card__title,\n      .scaler-event-card--skeleton .scaler-event-card__speaker,\n      .scaler-event-card--skeleton .scaler-event-card__takeaways,\n      .scaler-event-card--skeleton .scaler-event-card__meta,\n      .scaler-event-card--skeleton .scaler-event-card__cta {\n        background: linear-gradient(90deg, var(--scaler-border) 25%, var(--scaler-surface) 50%, var(--scaler-border) 75%);\n        background-size: 200% 100%;\n        animation: shimmer 1.5s infinite;\n        color: transparent !important;\n        border-color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-event-card--skeleton .scaler-event-card__title { min-height: 44px; }\n      .scaler-event-card--skeleton .scaler-event-card__speaker { min-height: 16px; }\n      .scaler-event-card--skeleton .scaler-event-card__meta { min-height: 24px; }\n      .scaler-event-card--skeleton .scaler-event-card__cta { min-height: 40px; }\n      .scaler-event-card--skeleton .scaler-event-card__image,\n      .scaler-event-card--skeleton .scaler-event-card__img-footer,\n      .scaler-event-card--skeleton .scaler-event-card__live-badge { display: none; }\n\n      @keyframes shimmer {\n        0% { background-position: 200% 0; }\n        100% { background-position: -200% 0; }\n      }\n\n      .scaler-events-empty {\n        text-align: center;\n        padding: 40px 20px;\n        color: var(--scaler-text-secondary);\n        font-size: 15px;\n      }\n\n      @media (max-width: 768px) {\n        .scaler-events-carousel { padding: 16px; }\n        .scaler-event-swiper .swiper-slide { width: calc(100vw - 52px); }\n        .scaler-events-nav__btn { display: none; }\n      }\n    <\/style>\n\n\n\n    <div class=\"scaler-events-carousel js-scaler-carousel\">\n\n      <template class=\"js-event-card-template\">\n        <div class=\"swiper-slide\">\n          <article class=\"scaler-event-card\">\n            <div class=\"scaler-event-card__header\">\n              <div class=\"scaler-event-card__image-wrapper\">\n                <img decoding=\"async\" src=\"\" alt=\"\" class=\"scaler-event-card__image\" loading=\"lazy\">\n                <div class=\"scaler-event-card__img-footer\">\n                  <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M11.199 7.957c-3.086 0-5.588 2.502-5.588 5.588s2.502 5.588 5.588 5.588c3.086 0 5.588-2.502 5.588-5.588s-2.502-5.588-5.588-5.588zM3.611 13.545c0-4.191 3.397-7.588 7.588-7.588s7.588 3.397 7.588 7.588c0 4.191-3.397 7.588-7.588 7.588s-7.588-3.397-7.588-7.588z\"\/><path d=\"M21.090 6.369h0.003c1.989 0 3.897 0.79 5.303 2.197s2.197 3.314 2.197 5.303-0.79 3.897-2.197 5.303c-1.406 1.407-3.314 2.197-5.303 2.197-0.552 0-1-0.448-1-1s0.448-1 1-1c1.459 0 2.858-0.579 3.889-1.611s1.611-2.43 1.611-3.889c0-1.459-0.58-2.858-1.611-3.889s-2.429-1.611-3.888-1.611c-0.507 0.002-1.013 0.070-1.502 0.203-0.533 0.145-1.082-0.17-1.227-0.703s0.17-1.082 0.703-1.227c0.659-0.179 1.339-0.27 2.021-0.272z\"\/><path d=\"M10.906 21.364c-1.605 0-3.186 0.386-4.61 1.126s-2.649 1.811-3.572 3.124c-0.318 0.452-0.941 0.561-1.393 0.243s-0.561-0.941-0.243-1.393c1.107-1.576 2.577-2.862 4.286-3.749s3.606-1.351 5.532-1.351 3.823 0.463 5.532 1.351c1.709 0.888 3.179 2.174 4.286 3.749 0.318 0.452 0.209 1.076-0.243 1.393s-1.076 0.209-1.393-0.243c-0.923-1.313-2.148-2.385-3.572-3.124s-3.005-1.126-4.61-1.126z\"\/><\/svg>\n                  <span class=\"js-event-count\"><\/span>\n                <\/div>\n                <div class=\"scaler-event-card__live-badge\" style=\"display: none;\">Live<\/div>\n              <\/div>\n              <div class=\"scaler-event-card__text\">\n                <h3 class=\"scaler-event-card__title\"><\/h3>\n                <div class=\"scaler-event-card__speaker js-event-speaker\"><\/div>\n              <\/div>\n            <\/div>\n\n            <div class=\"scaler-event-card__takeaways js-event-takeaways\"><\/div>\n\n            <div class=\"scaler-event-card__spacer\"><\/div>\n\n            <div class=\"scaler-event-card__meta\">\n              <span class=\"js-event-date\"><\/span>\n              <span class=\"scaler-event-card__duration\">\n                <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M16 6.333c6.443 0 11.667 5.223 11.667 11.667s-5.223 11.667-11.667 11.667c-6.443 0-11.667-5.223-11.667-11.667v0c0.008-6.44 5.226-11.659 11.666-11.667h0.001zM16 28.333c5.707 0 10.333-4.626 10.333-10.333s-4.626-10.333-10.333-10.333c-5.707 0-10.333 4.626-10.333 10.333v0c0.007 5.704 4.629 10.326 10.333 10.333h0.001z\"\/><path d=\"M16 18.667c-0 0-0.001 0-0.001 0-0.184 0-0.35-0.074-0.471-0.195v0c-0.121-0.121-0.195-0.287-0.195-0.471s0.075-0.351 0.195-0.471l4.951-4.952c0.121-0.121 0.287-0.195 0.471-0.195s0.351 0.075 0.471 0.195v0c0.121 0.121 0.195 0.287 0.195 0.471s-0.075 0.351-0.195 0.471l-4.949 4.951c-0.121 0.121-0.288 0.196-0.472 0.196v0z\"\/><path d=\"M19 3.667h-6c-0.368 0-0.667-0.298-0.667-0.667v0c0-0.368 0.298-0.667 0.667-0.667v0h6c0.368 0 0.667 0.298 0.667 0.667v0c0 0.368-0.298 0.667-0.667 0.667v0z\"\/><\/svg>\n                <span class=\"js-event-duration\"><\/span>\n              <\/span>\n            <\/div>\n\n            <a href=\"#\" class=\"scaler-event-card__cta js-event-cta\">Register with 1-Click<\/a>\n          <\/article>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-events-carousel__inner\">\n        <header class=\"scaler-events-header\">\n          <span class=\"scaler-events-header__icon\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 33 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M6.406 6.8c-0.11 0-0.2 0.090-0.2 0.2v20c0 0.11 0.090 0.2 0.2 0.2h20c0.11 0 0.2-0.090 0.2-0.2v-20c0-0.11-0.090-0.2-0.2-0.2h-20zM4.606 7c0-0.994 0.806-1.8 1.8-1.8h20c0.994 0 1.8 0.806 1.8 1.8v20c0 0.994-0.806 1.8-1.8 1.8h-20c-0.994 0-1.8-0.806-1.8-1.8v-20z\"\/><path d=\"M22.406 3.2c0.442 0 0.8 0.358 0.8 0.8v4c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-4c0-0.442 0.358-0.8 0.8-0.8z\"\/><path d=\"M10.406 3.2c0.442 0 0.8 0.358 0.8 0.8v4c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-4c0-0.442 0.358-0.8 0.8-0.8z\"\/><path d=\"M4.606 12c0-0.442 0.358-0.8 0.8-0.8h22c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-22c-0.442 0-0.8-0.358-0.8-0.8z\"\/><path d=\"M21.488 16.451c0.303 0.322 0.288 0.828-0.034 1.131l-5.838 5.5c-0.309 0.291-0.791 0.29-1.099-0.002l-3.162-3c-0.321-0.304-0.334-0.81-0.030-1.131s0.81-0.334 1.131-0.030l2.614 2.48 5.287-4.981c0.322-0.303 0.828-0.288 1.131 0.034z\"\/><\/svg>\n          <\/span>\n          <h2 class=\"scaler-events-header__title\"><span class=\"ez-toc-section\" id=\"live-masterclasses\"><\/span>Live Masterclasses<span class=\"ez-toc-section-end\"><\/span><\/h2>\n        <\/header>\n\n        <div class=\"scaler-events-swiper-wrap\">\n          <div class=\"swiper scaler-event-swiper\">\n            <div class=\"swiper-wrapper scaler-events-wrapper\"><\/div>\n            <div class=\"swiper-pagination scaler-events-pagination\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-events-nav__btn scaler-nav-prev\" aria-label=\"Previous slide\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n          <button class=\"scaler-events-nav__btn scaler-nav-next\" aria-label=\"Next slide\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n        <\/div>\n\n        <a class=\"scaler-events-viewall\" href=\"https:\/\/www.scaler.com\/events\/\">\n          <span>View All Events<\/span>\n          <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n        <\/a>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n\n      const monthNames = [\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"];\n\n      function formatTime(st) {\n        const t = new Date(st);\n        const date = t.getDate();\n        const month = monthNames[t.getMonth()];\n        const year = t.getFullYear();\n        const h = t.getHours();\n        const m = String(t.getMinutes()).padStart(2, \"0\");\n        let time;\n        if (h === 0) time = `12:${m} AM`;\n        else if (h === 12) time = `12:${m} PM`;\n        else if (h > 12) time = `${h - 12}:${m} PM`;\n        else time = `${h}:${m} AM`;\n        return `${date} ${month} ${year} | ${time}`;\n      }\n\n      const carouselInstances = document.querySelectorAll('.js-scaler-carousel');\n\n      carouselInstances.forEach(container => {\n\n          if(container.dataset.initialized === \"true\") return;\n          container.dataset.initialized = \"true\";\n\n          const swiperElement = container.querySelector(\".scaler-event-swiper\");\n          const swiperWrapper = container.querySelector(\".scaler-events-wrapper\");\n          const template = container.querySelector(\".js-event-card-template\");\n          const nextBtn = container.querySelector(\".scaler-nav-next\");\n          const prevBtn = container.querySelector(\".scaler-nav-prev\");\n          const paginationEl = container.querySelector(\".scaler-events-pagination\");\n\n          if (!swiperWrapper || !template) {\n             console.error(\"Scaler Carousel: Missing required elements inside container\");\n             return;\n          }\n\n          const swiper = new Swiper(swiperElement, {\n            slidesPerView: \"auto\",\n            spaceBetween: 16,\n            grabCursor: true,\n            observer: true,\n            observeParents: true,\n            pagination: {\n                el: paginationEl,\n                clickable: true,\n                dynamicBullets: true\n            },\n            navigation: {\n                nextEl: nextBtn,\n                prevEl: prevBtn\n            },\n          });\n\n          function showSkeletons(count = 4) {\n            swiperWrapper.innerHTML = \"\";\n            for (let i = 0; i < count; i++) {\n              const clone = template.content.cloneNode(true);\n              const card = clone.querySelector(\".scaler-event-card\");\n              card.classList.add(\"scaler-event-card--skeleton\");\n              swiperWrapper.appendChild(clone);\n            }\n            swiper.update();\n          }\n\n          function renderEvents(events) {\n            swiperWrapper.innerHTML = \"\";\n\n            if (events.length === 0) {\n              swiperWrapper.innerHTML = `<div class=\"scaler-events-empty\">No upcoming masterclasses found.<\/div>`;\n              return;\n            }\n\n            const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n            const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n\n            events.forEach(event => {\n              const attr = event.attributes;\n              const cd = attr.custom_data || {};\n              const clone = template.content.cloneNode(true);\n              const joinUrl = `\/event\/${attr.slug}\/?utm_source=blog&utm_medium=master_class&utm_content=${currentSlug}`;\n\n              \/\/ Instructor headshot\n              const instructor = (cd.instructors && cd.instructors[0]) || {};\n              const img = clone.querySelector(\".scaler-event-card__image\");\n              img.src = instructor.media_url || attr.image_url ||\n                \"https:\/\/images.unsplash.com\/photo-1531891437562-4301cf35b7e4?w=200&h=200&fit=crop\";\n              img.alt = instructor.name || attr.instructor_name || attr.title;\n\n              \/\/ Title + speaker\n              clone.querySelector(\".scaler-event-card__title\").textContent = attr.title;\n              clone.querySelector(\".js-event-speaker\").textContent = instructor.name || attr.instructor_name || \"\";\n\n              \/\/ Live chip vs attendee count\n              const isLive = attr.status === \"current\";\n              const footer = clone.querySelector(\".scaler-event-card__img-footer\");\n              const liveBadge = clone.querySelector(\".scaler-event-card__live-badge\");\n              if (isLive) {\n                footer.style.display = \"none\";\n                liveBadge.style.display = \"flex\";\n                liveBadge.textContent = \"Live\";\n              } else if (attr.registration_count) {\n                clone.querySelector(\".js-event-count\").textContent = attr.registration_count;\n              } else {\n                footer.style.display = \"none\";\n              }\n\n              \/\/ Takeaways (up to 2, Know More on the last)\n              const takeaways = (cd.takeaways || []).slice(0, 2);\n              const listEl = clone.querySelector(\".js-event-takeaways\");\n              listEl.innerHTML = \"\";\n              takeaways.forEach((t, idx) => {\n                const item = document.createElement(\"div\");\n                item.className = \"scaler-event-card__takeaway-item\";\n                const dot = document.createElement(\"span\");\n                dot.className = \"scaler-event-card__dot\";\n                const txt = document.createElement(\"span\");\n                txt.className = \"scaler-event-card__takeaway-text\";\n                txt.textContent = t;\n                item.appendChild(dot);\n                item.appendChild(txt);\n                if (idx === takeaways.length - 1) {\n                  const km = document.createElement(\"a\");\n                  km.className = \"scaler-event-card__knowmore\";\n                  km.textContent = \"Know More\";\n                  km.href = joinUrl;\n                  item.appendChild(km);\n                }\n                listEl.appendChild(item);\n              });\n\n              \/\/ Date + duration\n              clone.querySelector(\".js-event-date\").textContent = formatTime(attr.start_time);\n              let hrs = \"\";\n              if (attr.duration) {\n                hrs = (attr.duration \/ 60).toFixed(2);\n              } else if (attr.end_time) {\n                hrs = (Math.abs(new Date(attr.start_time) - new Date(attr.end_time)) \/ 3600000).toFixed(2);\n              }\n              clone.querySelector(\".js-event-duration\").textContent = hrs ? `${hrs} Hrs` : \"\";\n\n              \/\/ CTA\n              clone.querySelector(\".js-event-cta\").href = joinUrl;\n\n              swiperWrapper.appendChild(clone);\n            });\n\n            swiper.update();\n            swiper.slideTo(0);\n          }\n\n          async function fetchEvents() {\n            try {\n              showSkeletons();\n              const res = await fetch(\n                \"https:\/\/www.scaler.com\/api\/v4\/events?event_type[]=company&distributor=scaler&type=upcoming&serializer_mode=L2&limit=8&program[]=software_development&program[]=data_science&program[]=devops&program[]=ai_ml\"\n              );\n              const json = await res.json();\n              const events = json.data || [];\n              renderEvents(events);\n            } catch (error) {\n              console.error(\"Failed to load events:\", error);\n              if(swiperWrapper) swiperWrapper.innerHTML = `<div class=\"scaler-events-empty\">Failed to load events.<\/div>`;\n            }\n          }\n\n          fetchEvents();\n      });\n    });\n    <\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>2. A URL Shortener REST API<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a small URL-shortening service with POST \/shorten generating a Base62 code and GET \/{code} returning a 302 redirect. Start with an in-memory store, then move the data to Redis or Postgres and add hit counters.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> the in-memory store introduces concurrent access. Multiple HTTP requests can read and write the same map at the same time, so you\u2019ll need to protect it with sync.RWMutex. Run go test -race to catch unsafe access. This is also one of those golang projects for beginners where you can understand Go\u2019s approach to sharing state between goroutines.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">A simple mutex-guarded store could look like this; you can use this for your :<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">type Store struct {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;mu &nbsp; sync.RWMutex<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;data map[string]string<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">func (s *Store) Get(key string) (string, bool) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;s.mu.RLock()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;defer s.mu.RUnlock()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;value, ok := s.data[key]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;return value, ok<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here, RLock() allows multiple reads at the same time while preventing a write from happening concurrently. You can then use the same pattern for methods that modify the map with Lock().<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Beginner &#8211; Intermediate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> net\/http, go-chi\/chi or gin-gonic\/gin, sync, encoding\/json, redis\/go-redis<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 1 &#8211; 1.5 weeks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> HTTP handlers and middleware, appropriate status codes, concurrent-safe shared state, and the difference between a regular Go map and one that can safely be accessed by multiple goroutines.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the HTTP layer, you can use either <strong>Gin<\/strong> or <strong>Chi<\/strong>. Both are worth trying, but the standard library&#8217;s net\/http is enough to build the core API too.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>3. A Public-API CLI Client with Caching and Timeouts<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a CLI that queries a public API, such as weather, currency, train, or cricket-score data. Start with the API request itself, then add local disk caching, retries with exponential backoff, and a hard timeout.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> You can use context.Context here. Every outbound request can carry a deadline, and cancelling the CLI with Ctrl-C can stop work that is still in progress instead of leaving the request running.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Beginner &#8211; Intermediate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> net\/http, context, time, encoding\/json, os<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 1 week<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> making HTTP requests from Go, handling timeouts and cancellation, retrying failed requests, and deciding when cached data can be used instead of making another API call.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In some of the beginner golang projects, when you make an API request, you don\u2019t always know how long the server will take to respond. context.Context lets you set a deadline for that request and cancel it when the user stops the CLI. This means your program can stop waiting for work that is no longer useful instead of leaving the request running in the background.<\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        --cl-primary: #005bb3;\n        --cl-brand-blue: #255aad;\n        --cl-card-bg: #ffffff;\n        --cl-surface: #f6f7f8;\n        --cl-border: #d6dee5;\n        --cl-text-primary: #1a2c47;   \/* neutral-scale-12 *\/\n        --cl-text-secondary: #61738e; \/* neutral-scale-9 *\/\n        --cl-radius: 16px;\n        --cl-radius-sm: 8px;\n        --cl-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-courses * { box-sizing: border-box; }\n\n      .scaler-courses {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        width: 100%;\n      }\n      .scaler-courses__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Header *\/\n      .scaler-courses__header {\n        display: flex;\n        align-items: center;\n        gap: 8px;\n        margin-bottom: 8px;\n        padding: 8px 0;\n      }\n      .scaler-courses__header-icon { display: inline-flex; color: var(--cl-text-primary); }\n      .scaler-courses__header-icon svg { width: 24px; height: 24px; }\n      .scaler-courses__title {\n        font-size: 18px;\n        font-weight: 700;\n        color: var(--cl-text-primary);\n        line-height: 1.3;\n        margin: 0;\n      }\n\n      \/* Swiper *\/\n      .scaler-courses__swiper-wrap { position: relative; }\n      .scaler-courses .swiper { width: 100%; padding: 4px; }\n      .scaler-courses-swiper .swiper-slide {\n        width: 296px;\n        height: auto;\n        display: flex;\n      }\n\n      \/* Card *\/\n      .scaler-course-card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        height: 100%;\n        min-height: 336px;\n        background: var(--cl-card-bg);\n        border: 1px solid var(--cl-border);\n        border-radius: var(--cl-radius);\n        overflow: hidden;\n        text-decoration: none;\n        cursor: pointer;\n        transition: box-shadow 0.2s ease;\n      }\n      .scaler-course-card:hover { box-shadow: 0 2px 12px rgba(50, 71, 102, 0.12); }\n\n      .scaler-course-card__image {\n        width: 100%;\n        height: 128px;\n        min-height: 128px;\n        object-fit: cover;\n        background: var(--cl-surface);\n        display: block;\n      }\n\n      .scaler-course-card__detail {\n        display: flex;\n        flex-direction: column;\n        flex: 1 1 auto;\n        padding: 16px 16px 8px;\n      }\n      .scaler-course-card__heading,\n      .scaler-course-card__heading:link,\n      .scaler-course-card__heading:visited {\n        font-size: 20px;\n        font-weight: 600;\n        line-height: 1.4;\n        color: var(--cl-text-primary) !important;\n        margin: 0 0 8px;\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-course-card__instructor {\n        font-size: 14px;\n        line-height: 1.86;\n        color: var(--cl-text-primary);\n        white-space: nowrap;\n        overflow: hidden;\n        text-overflow: ellipsis;\n      }\n      .scaler-course-card__instructor b { font-weight: 700; }\n      .scaler-course-card__desc {\n        flex-grow: 1;\n        margin-top: 8px;\n        margin-bottom: 12px;\n        font-size: 16px;\n        line-height: 1.5;\n        color: var(--cl-text-secondary);\n        display: -webkit-box;\n        -webkit-line-clamp: 2;\n        -webkit-box-orient: vertical;\n        overflow: hidden;\n      }\n\n      .scaler-course-card__footer {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        width: 100%;\n      }\n      .scaler-course-card__stat {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-size: 14px;\n        color: var(--cl-text-primary);\n      }\n      .scaler-course-card__stat svg { width: 18px; height: 18px; flex-shrink: 0; }\n      .scaler-course-card__stat img { width: 20px; height: 20px; flex-shrink: 0; }\n\n      \/* Side arrows *\/\n      .scaler-courses__nav {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important; height: 46px !important; min-width: 46px;\n        display: flex !important; align-items: center; justify-content: center;\n        padding: 0 !important;\n        background: var(--cl-card-bg) !important;\n        border: none !important;\n        border-radius: var(--cl-radius-sm) !important;\n        box-shadow: var(--cl-shadow) !important;\n        color: var(--cl-text-secondary) !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-courses__nav--prev { left: 8px !important; }\n      .scaler-courses__nav--next { right: 8px !important; }\n      .scaler-courses__nav svg { width: 20px !important; height: 20px !important; fill: var(--cl-text-secondary) !important; }\n      .scaler-courses__nav.swiper-button-disabled { opacity: 0; visibility: hidden; pointer-events: none; }\n\n      .scaler-courses .swiper-button-prev,\n      .scaler-courses .swiper-button-next,\n      .scaler-courses .swiper-pagination { display: none; }\n\n      \/* Skeleton *\/\n      .scaler-course-card--skeleton { pointer-events: none; }\n      .scaler-course-card--skeleton .scaler-course-card__image,\n      .scaler-course-card--skeleton .scaler-course-card__heading,\n      .scaler-course-card--skeleton .scaler-course-card__instructor,\n      .scaler-course-card--skeleton .scaler-course-card__desc,\n      .scaler-course-card--skeleton .scaler-course-card__footer {\n        background: linear-gradient(90deg, var(--cl-border) 25%, var(--cl-surface) 50%, var(--cl-border) 75%);\n        background-size: 200% 100%;\n        animation: cl-shimmer 1.5s infinite;\n        color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-course-card--skeleton .scaler-course-card__heading { height: 24px; margin: 0 0 8px; }\n      .scaler-course-card--skeleton .scaler-course-card__instructor { height: 16px; }\n      .scaler-course-card--skeleton .scaler-course-card__footer { height: 20px; }\n      @keyframes cl-shimmer { 0% { background-position: 200% 0; } 100% { background-position: -200% 0; } }\n\n      .scaler-courses__empty { display: none; }\n\n      @media (max-width: 768px) {\n        .scaler-courses { padding: 16px; }\n        .scaler-courses-swiper .swiper-slide { width: 260px; }\n        .scaler-courses__nav { display: none !important; }\n      }\n    <\/style>\n\n\n    <div class=\"scaler-courses js-scaler-courses\">\n\n      <template class=\"js-course-card-template\">\n        <div class=\"swiper-slide\">\n          <a class=\"scaler-course-card js-course-link\" href=\"#\" target=\"_blank\" rel=\"noopener\">\n            <img decoding=\"async\" class=\"scaler-course-card__image js-course-image\" src=\"\" alt=\"\" loading=\"lazy\">\n            <div class=\"scaler-course-card__detail\">\n              <div class=\"scaler-course-card__heading js-course-title\"><\/div>\n              <div class=\"scaler-course-card__instructor js-course-instructor\"><\/div>\n              <div class=\"scaler-course-card__desc js-course-desc\"><\/div>\n              <div class=\"scaler-course-card__footer\">\n                <span class=\"scaler-course-card__stat js-course-star\">\n                  <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M14.83 2.868c0.342-0.239 0.75-0.368 1.168-0.368s0.826 0.128 1.168 0.368c0.338 0.236 0.596 0.569 0.741 0.955l2.759 6.936c0.003 0.007 0.007 0.013 0.013 0.017s0.013 0.007 0.020 0.007l7.402 0.476c0.411 0.036 0.802 0.194 1.124 0.452s0.559 0.607 0.683 1 0.127 0.815 0.011 1.211c-0.116 0.396-0.347 0.748-0.664 1.013l-5.655 4.714c-0.013 0.011-0.022 0.025-0.028 0.040s-0.006 0.032-0.002 0.047l1.821 7.163c0.107 0.395 0.094 0.812-0.037 1.2-0.133 0.391-0.38 0.734-0.71 0.983s-0.727 0.393-1.14 0.413c-0.413 0.020-0.822-0.084-1.175-0.3l-0.015-0.009-6.307-4.005c-0.004-0.003-0.009-0.004-0.014-0.004s-0.009 0.001-0.013 0.004l-5.876 3.721c-0.389 0.235-0.839 0.347-1.292 0.323s-0.889-0.184-1.251-0.459c-0.361-0.275-0.632-0.652-0.777-1.082-0.143-0.426-0.157-0.885-0.038-1.319l1.684-6.629c0.004-0.016 0.003-0.033-0.002-0.049s-0.015-0.030-0.027-0.040l-5.653-4.714c-0.317-0.264-0.548-0.617-0.664-1.013s-0.112-0.817 0.011-1.211c0.124-0.394 0.361-0.742 0.683-1s0.713-0.416 1.124-0.452l0.023-0.002 7.38-0.476c0.007-0 0.014-0.003 0.020-0.007s0.010-0.010 0.013-0.017l0.008-0.020 2.746-6.913c0.145-0.386 0.403-0.719 0.741-0.956z\"\/><\/svg>\n                  <span class=\"js-course-star-val\"><\/span>\n                <\/span>\n                <span class=\"scaler-course-card__stat\">\n                  <img decoding=\"async\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/user-check-dark.svg\" alt=\"Enrolled\" loading=\"lazy\">\n                  <span class=\"js-course-reg\"><\/span>\n                <\/span>\n              <\/div>\n            <\/div>\n          <\/a>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-courses__inner\">\n        <div class=\"scaler-courses__header\">\n          <span class=\"scaler-courses__header-icon\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M26.259 23.289h-20.518c-1.193 0-2.16-0.967-2.16-2.16v0-14.588c0-1.193 0.967-2.16 2.16-2.16v0h20.518c1.193 0 2.16 0.967 2.16 2.16v0 14.588c0 1.193-0.967 2.16-2.16 2.16v0zM5.741 5.501c-0.574 0-1.040 0.466-1.040 1.040v0 14.588c0 0.574 0.466 1.040 1.040 1.040v0h20.518c0.574 0 1.040-0.466 1.040-1.040v0-14.588c0-0.574-0.466-1.040-1.040-1.040v0z\"\/><path d=\"M19.764 27.619h-7.53c-0.309 0-0.56-0.251-0.56-0.56v0c0-0.309 0.251-0.56 0.56-0.56h7.53c0.309 0 0.56 0.251 0.56 0.56v0c0 0.309-0.251 0.56-0.56 0.56v0z\"\/><path d=\"M14.023 9.322c0.116 0 0.223 0.035 0.312 0.096l-0.002-0.001 5.93 3.953c0.151 0.102 0.249 0.272 0.249 0.466s-0.098 0.364-0.247 0.465l-0.002 0.001-5.93 3.953c-0.087 0.059-0.195 0.094-0.31 0.094-0.309 0-0.56-0.25-0.56-0.559v-7.906c0-0.309 0.251-0.56 0.56-0.56v0zM18.943 13.835l-4.36-2.906v5.813z\"\/><\/svg>\n          <\/span>\n          <h2 class=\"scaler-courses__title\"><span class=\"ez-toc-section\" id=\"free-courses-by-top-scaler-instructors\"><\/span>Free Courses by top Scaler instructors<span class=\"ez-toc-section-end\"><\/span><\/h2>\n        <\/div>\n\n        <div class=\"scaler-courses__swiper-wrap\">\n          <div class=\"swiper scaler-courses-swiper\">\n            <div class=\"swiper-wrapper js-courses-wrapper\"><\/div>\n            <div class=\"swiper-pagination\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-courses__nav scaler-courses__nav--prev js-courses-prev\" aria-label=\"Previous\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n          <button class=\"scaler-courses__nav scaler-courses__nav--next js-courses-next\" aria-label=\"Next\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"\/><\/svg>\n          <\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n      const EXTRA_COUNT_ADDED = 1000;\n\n      \/\/ Mirrors getInstructorStar(): first token of the headline.\n      function getInstructorStar(headline) {\n        return (headline || \"\").toString().split(\" \")[0] || \"\";\n      }\n\n      document.querySelectorAll(\".js-scaler-courses\").forEach(container => {\n        if (container.dataset.initialized === \"true\") return;\n        container.dataset.initialized = \"true\";\n\n        const swiperElement = container.querySelector(\".scaler-courses-swiper\");\n        const wrapper = container.querySelector(\".js-courses-wrapper\");\n        const template = container.querySelector(\".js-course-card-template\");\n        const nextBtn = container.querySelector(\".js-courses-next\");\n        const prevBtn = container.querySelector(\".js-courses-prev\");\n\n        if (!wrapper || !template) return;\n\n        const swiper = new Swiper(swiperElement, {\n          slidesPerView: \"auto\",\n          spaceBetween: 16,\n          grabCursor: true,\n          observer: true,\n          observeParents: true,\n          navigation: { nextEl: nextBtn, prevEl: prevBtn },\n        });\n\n        const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n        const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n\n        function showSkeletons(count = 4) {\n          wrapper.innerHTML = \"\";\n          for (let i = 0; i < count; i++) {\n            const clone = template.content.cloneNode(true);\n            clone.querySelector(\".scaler-course-card\").classList.add(\"scaler-course-card--skeleton\");\n            wrapper.appendChild(clone);\n          }\n          swiper.update();\n        }\n\n        function renderCourses(courses) {\n          wrapper.innerHTML = \"\";\n          if (!courses.length) { container.style.display = \"none\"; return; }\n\n          courses.forEach(item => {\n            const a = item.attributes || {};\n            const clone = template.content.cloneNode(true);\n            const instructor = (a.instructors_data && a.instructors_data[0]) || {};\n\n            clone.querySelector(\".js-course-link\").href =\n              `https:\/\/www.scaler.com\/topics\/course\/${a.slug}\/?utm_source=blog&utm_medium=free_courses&utm_content=${currentSlug}`;\n\n            const img = clone.querySelector(\".js-course-image\");\n            img.src = a.cover_image_thumbnail || a.featured_image || \"\";\n            img.alt = a.title || \"\";\n\n            clone.querySelector(\".js-course-title\").textContent = a.title || \"\";\n\n            const instrEl = clone.querySelector(\".js-course-instructor\");\n            if (instructor.name) {\n              instrEl.innerHTML = \"A Course by <b><\/b>\";\n              instrEl.querySelector(\"b\").textContent = instructor.name;\n            } else {\n              instrEl.style.display = \"none\";\n            }\n\n            clone.querySelector(\".js-course-desc\").textContent = a.description || \"\";\n\n            \/\/ Star\n            const star = getInstructorStar(instructor.star_headline);\n            const starWrap = clone.querySelector(\".js-course-star\");\n            if (star && star !== \"0\") clone.querySelector(\".js-course-star-val\").textContent = star;\n            else starWrap.style.display = \"none\";\n\n            \/\/ Enrolled count (+1000 like topics)\n            clone.querySelector(\".js-course-reg\").textContent =\n              ((a.user_registration_count || 0) + EXTRA_COUNT_ADDED).toLocaleString(\"en-US\");\n\n            wrapper.appendChild(clone);\n          });\n\n          swiper.update();\n          swiper.slideTo(0);\n        }\n\n        async function fetchCourses() {\n          try {\n            showSkeletons();\n            \/\/ Public same-origin endpoint (topics course search). Returns 6 free courses.\n            const res = await fetch(\"\/topics\/api\/v1\/search\/courses\", {\n              method: \"POST\",\n              headers: {\n                \"Content-Type\": \"application\/json\",\n                \"Accept\": \"application\/json\",\n                \"X-Requested-With\": \"XMLHttpRequest\",\n              },\n              body: JSON.stringify({\n                filters: {\n                  q: \"\",\n                  page: { limit: 6, current_page: 1 },\n                  sort: { key: \"user_registration_count\", order: \"desc\" },\n                  filter_type: null,\n                  tags: [],\n                  program: [],\n                  level: [],\n                  category_type: [],\n                },\n              }),\n            });\n            const json = await res.json();\n            const courses = (json && json.data) || [];\n            renderCourses(courses);\n          } catch (error) {\n            console.error(\"Failed to load courses:\", error);\n            container.style.display = \"none\";\n          }\n        }\n\n        fetchCourses();\n      });\n    });\n    <\/script>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>4. A Static Site Generator (Markdown to HTML)<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a small static site generator that reads a content directory, parses Markdown and front matter, renders the content through templates, and generates the final HTML files. Add an index page and tag pages so you have to think about how content moves through the whole pipeline.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> you get to work with parts of the standard library that are useful beyond this project, particularly html\/template, io\/fs, and the io.Reader\/io.Writer model. It\u2019s also a good place to use interfaces for a real design decision. For example, separating the content reader from the renderer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> html\/template, io\/fs, path\/filepath, yuin\/goldmark<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 1 &#8211; 2 weeks<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> Working with Go\u2019s standard library instead of depending on a framework for every part of the application, handling files and templates, and using interfaces to separate different parts of the implementation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Check whichever idea seems most interesting to you and give your all to turn them into your best golang projects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you\u2019re building toward backend development, these foundation projects also give you useful groundwork for a broader <a href=\"https:\/\/www.scaler.com\/blog\/backend-developer-roadmap\/\">backend developer roadmap<\/a>.<\/p>\n\n\n<style data-wp-block-html=\"css\">\n<style>\n      :root {\n        --sp-brand: #255aad;            \/* brand blue *\/\n        --sp-brand-hover: #19468c;\n        --sp-card-bg: #ffffff;          \/* neutral-scale-0 *\/\n        --sp-surface: #f4f6f9;          \/* neutral-scale-2 *\/\n        --sp-pill-bg: #f8fafc;\n        --sp-border: #d6dee5;           \/* neutral-scale-4 *\/\n        --sp-text-primary: #1a2c47;     \/* neutral-scale-12 *\/\n        --sp-text-secondary: #61738e;   \/* neutral-scale-9 *\/\n      }\n\n      .scaler-placement * { box-sizing: border-box; }\n\n      .scaler-placement {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        width: 100%;\n        max-width: 100%;\n        margin: 24px auto;\n        display: flex;\n        flex-direction: column;\n      }\n\n      \/* ---- Placement report (OnlineCallout) ---- *\/\n      .scaler-placement__title {\n        font-size: 24px;\n        font-weight: 600;\n        line-height: 1.3;\n        color: var(--sp-text-primary);\n        margin: 0 0 16px;\n      }\n\n      .scaler-placement__card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        background: var(--sp-card-bg);\n        border: 1px solid var(--sp-border);\n        border-radius: 20px;\n        padding: 16px;\n        box-shadow: 0 8px 32px rgba(37, 90, 173, 0.04);\n        overflow: hidden;\n        gap: 5px;\n      }\n\n      .scaler-placement__top {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        width: 100%;\n        gap: 18px;\n      }\n\n      .scaler-placement__stat-block {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        align-items: center;\n        width: 30%;\n        min-width: 200px;\n        flex-shrink: 0;\n        background: var(--sp-surface);\n        border: 1px solid var(--sp-border);\n        border-radius: 16px;\n        padding: 16px 10px;\n        gap: 8px;\n      }\n      .scaler-placement__stat-number {\n        font-size: 48px;\n        font-weight: 600;\n        line-height: 1;\n        color: var(--sp-brand);\n        text-align: center;\n      }\n      .scaler-placement__stat-label {\n        font-size: 13px;\n        font-weight: 600;\n        line-height: 14px;\n        color: rgba(37, 90, 173, 0.85);\n        text-transform: uppercase;\n        letter-spacing: 0.8px;\n      }\n\n      .scaler-placement__info {\n        display: flex;\n        flex-direction: column;\n        justify-content: center;\n        flex: 1;\n        gap: 10px;\n      }\n      .scaler-placement__proof-header {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 8px;\n      }\n      .scaler-placement__proof-header svg { width: 18px; height: 18px; flex-shrink: 0; }\n      .scaler-placement__proof-label {\n        font-size: 12px;\n        font-weight: 600;\n        line-height: 16px;\n        color: var(--sp-brand);\n        text-transform: uppercase;\n        letter-spacing: 1px;\n      }\n      .scaler-placement__body-text {\n        font-size: 16px;\n        font-weight: 400;\n        line-height: 24px;\n        color: var(--sp-text-primary);\n        margin: 0;\n      }\n\n      .scaler-placement__bottom {\n        display: flex;\n        flex-direction: column;\n        align-items: flex-start;\n        margin-left: calc(30% + 18px);\n        width: calc(70% - 18px);\n        gap: 12px;\n      }\n      .scaler-placement__stats-row {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 24px;\n      }\n      .scaler-placement__stat-item {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 8px;\n      }\n      .scaler-placement__stat-item > svg {\n        color: var(--sp-brand);\n        width: 18px;\n        height: 18px;\n        flex-shrink: 0;\n      }\n      .scaler-placement__stat-text {\n        display: flex;\n        flex-direction: row;\n        align-items: center;\n        gap: 4px;\n      }\n      .scaler-placement__stat-value {\n        font-size: 16px;\n        font-weight: 600;\n        line-height: 24px;\n        color: var(--sp-text-primary);\n      }\n      .scaler-placement__stat-desc {\n        font-size: 14px;\n        font-weight: 400;\n        line-height: 20px;\n        color: var(--sp-text-secondary);\n      }\n\n      .scaler-placement__cta,\n      .scaler-placement__cta:link,\n      .scaler-placement__cta:visited {\n        display: inline-flex;\n        align-items: center;\n        align-self: flex-start;\n        font-size: 14px;\n        font-weight: 600;\n        line-height: 20px;\n        color: var(--sp-brand) !important;\n        gap: 6px;\n        text-decoration: none;\n        cursor: pointer;\n        margin-top: 2px;\n        transition: color 0.25s ease;\n      }\n      .scaler-placement__cta:hover,\n      .scaler-placement__cta:focus { color: var(--sp-brand-hover) !important; }\n      .scaler-placement__cta svg {\n        width: 14px;\n        height: 14px;\n        fill: currentColor;\n        transition: transform 0.25s ease;\n      }\n      .scaler-placement__cta:hover svg { transform: translateX(3px); }\n\n      \/* ---- Hiring Partners ---- *\/\n      .scaler-hiring {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        flex-wrap: wrap;\n        gap: 8px 12px;\n        margin: 24px 0 8px;\n        padding-top: 16px;\n        border-top: 1px solid var(--sp-border);\n      }\n      .scaler-hiring__label {\n        font-size: 14px;\n        color: var(--sp-text-secondary);\n        white-space: nowrap;\n      }\n      .scaler-hiring__pills {\n        display: flex;\n        align-items: center;\n        flex-wrap: wrap;\n        gap: 8px;\n      }\n      .scaler-hiring__pill {\n        display: inline-flex;\n        align-items: center;\n        gap: 6px;\n        padding: 5px 12px 5px 5px;\n        background: var(--sp-pill-bg);\n        border-radius: 999px;\n      }\n      .scaler-hiring__badge {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        flex-shrink: 0;\n        width: 24px;\n        height: 24px;\n        border-radius: 50%;\n        background: #ffffff;\n      }\n      .scaler-hiring__logo {\n        width: 16px !important;\n        height: 16px !important;\n        object-fit: contain;\n        margin: 0 !important;\n        display: block;\n      }\n      .scaler-hiring__name {\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--sp-text-primary);\n      }\n      .scaler-hiring__more {\n        font-size: 14px;\n        color: var(--sp-text-secondary);\n      }\n\n      @media (max-width: 768px) {\n        .scaler-placement__title { font-size: 18px; margin-bottom: 12px; }\n        .scaler-placement__card { gap: 16px; border-radius: 16px; }\n        .scaler-placement__top { gap: 12px; }\n        .scaler-placement__stat-block { width: 35%; min-width: 110px; padding: 12px 8px; gap: 4px; }\n        .scaler-placement__stat-number { font-size: 24px; }\n        .scaler-placement__stat-label { font-size: 10px; }\n        .scaler-placement__body-text { font-size: 14px; line-height: 20px; }\n        .scaler-placement__bottom { margin-left: 0; width: 100%; gap: 16px; }\n        .scaler-placement__stats-row { flex-wrap: wrap; gap: 10px 16px; }\n        .scaler-placement__stat-value { font-size: 14px; line-height: 20px; }\n        .scaler-placement__stat-desc { font-size: 12px; line-height: 16px; }\n      }\n<\/style>\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&#038;display=swap\" rel=\"stylesheet\">\n\n<div class=\"scaler-placement\">\n      <h2 class=\"scaler-placement__title\"><span class=\"ez-toc-section\" id=\"scaler-placement-report-and-statistics\"><\/span>Scaler Placement Report and Statistics<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n      <div class=\"scaler-placement__card\">\n        <div class=\"scaler-placement__top\">\n          <div class=\"scaler-placement__stat-block\">\n            <div class=\"scaler-placement__stat-number\">\u20b923L<\/div>\n            <div class=\"scaler-placement__stat-label\">AVG CTC<\/div>\n          <\/div>\n          <div class=\"scaler-placement__info\">\n            <div class=\"scaler-placement__proof-header\">\n              <svg viewBox=\"0 0 21 21\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M8.64 0 0 8.683V21h12.257l8.64-8.683V0H8.64zm-.11 17.257H3.725v-4.828H8.53v4.828zm7.901-1.88-4.174 4.194V8.684H1.447l4.076-4.14h10.914l-.006 10.83v.004z\" fill=\"#255aad\"><\/path><\/svg>\n              <span class=\"scaler-placement__proof-label\">SCALER PLACEMENT PROOF<\/span>\n            <\/div>\n            <p class=\"scaler-placement__body-text\">\n              Scaler learners achieved 2.5x salary growth with average post-Scaler CTC reaching \u20b923L.\n            <\/p>\n          <\/div>\n        <\/div>\n\n        <div class=\"scaler-placement__bottom\">\n          <div class=\"scaler-placement__stats-row\">\n            <div class=\"scaler-placement__stat-item\">\n              <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M11.199 7.957c-3.086 0-5.588 2.502-5.588 5.588s2.502 5.588 5.588 5.588c3.086 0 5.588-2.502 5.588-5.588s-2.502-5.588-5.588-5.588zM3.611 13.545c0-4.191 3.397-7.588 7.588-7.588s7.588 3.397 7.588 7.588c0 4.191-3.397 7.588-7.588 7.588s-7.588-3.397-7.588-7.588z\"><\/path><path d=\"M21.090 6.369h0.003c1.989 0 3.897 0.79 5.303 2.197s2.197 3.314 2.197 5.303-0.79 3.897-2.197 5.303c-1.406 1.407-3.314 2.197-5.303 2.197-0.552 0-1-0.448-1-1s0.448-1 1-1c1.459 0 2.858-0.579 3.889-1.611s1.611-2.43 1.611-3.889c0-1.459-0.58-2.858-1.611-3.889s-2.429-1.611-3.888-1.611c-0.507 0.002-1.013 0.070-1.502 0.203-0.533 0.145-1.082-0.17-1.227-0.703s0.17-1.082 0.703-1.227c0.659-0.179 1.339-0.27 2.021-0.272z\"><\/path><path d=\"M10.906 21.364c-1.605 0-3.186 0.386-4.61 1.126s-2.649 1.811-3.572 3.124c-0.318 0.452-0.941 0.561-1.393 0.243s-0.561-0.941-0.243-1.393c1.107-1.576 2.577-2.862 4.286-3.749s3.606-1.351 5.532-1.351 3.823 0.463 5.532 1.351c1.709 0.888 3.179 2.174 4.286 3.749 0.318 0.452 0.209 1.076-0.243 1.393s-1.076 0.209-1.393-0.243c-0.923-1.313-2.148-2.385-3.572-3.124s-3.005-1.126-4.61-1.126z\"><\/path><path d=\"M25.704 22.493c-1.424-0.74-3.005-1.125-4.61-1.124-0.552 0-1-0.447-1.001-0.999s0.447-1 0.999-1.001c1.926-0.001 3.824 0.462 5.533 1.349s3.179 2.174 4.286 3.751c0.317 0.452 0.208 1.076-0.244 1.393s-1.076 0.208-1.393-0.244c-0.922-1.313-2.147-2.385-3.571-3.125z\"><\/path><\/svg>\n              <div class=\"scaler-placement__stat-text\">\n                <span class=\"scaler-placement__stat-value\">11,000+<\/span>\n                <span class=\"scaler-placement__stat-desc\">placements<\/span>\n              <\/div>\n            <\/div>\n            <div class=\"scaler-placement__stat-item\">\n              <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M1.2 27.5c0-0.442 0.358-0.8 0.8-0.8h28c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-28c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M3.727 4.227c0.338-0.338 0.795-0.527 1.273-0.527h12c0.477 0 0.935 0.19 1.273 0.527s0.527 0.795 0.527 1.273v22c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-22c0-0.053-0.021-0.104-0.059-0.141s-0.088-0.059-0.141-0.059h-12c-0.053 0-0.104 0.021-0.141 0.059s-0.059 0.088-0.059 0.141v22c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-22c0-0.477 0.19-0.935 0.527-1.273z\"><\/path><path d=\"M17.2 12.5c0-0.442 0.358-0.8 0.8-0.8h9c0.477 0 0.935 0.19 1.273 0.527s0.527 0.795 0.527 1.273v14c0 0.442-0.358 0.8-0.8 0.8s-0.8-0.358-0.8-0.8v-14c0-0.053-0.021-0.104-0.059-0.141s-0.088-0.059-0.141-0.059h-9c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M7.2 9.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M9.2 17.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M7.2 22.5c0-0.442 0.358-0.8 0.8-0.8h4c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-4c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M21.2 22.5c0-0.442 0.358-0.8 0.8-0.8h2c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-2c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><path d=\"M21.2 17.5c0-0.442 0.358-0.8 0.8-0.8h2c0.442 0 0.8 0.358 0.8 0.8s-0.358 0.8-0.8 0.8h-2c-0.442 0-0.8-0.358-0.8-0.8z\"><\/path><\/svg>\n              <div class=\"scaler-placement__stat-text\">\n                <span class=\"scaler-placement__stat-value\">650+<\/span>\n                <span class=\"scaler-placement__stat-desc\">companies<\/span>\n              <\/div>\n            <\/div>\n            <div class=\"scaler-placement__stat-item\">\n              <svg viewBox=\"0 0 25 24\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M5.60938 18.8906C4.74688 18.0281 5.31875 16.2188 4.87813 15.1594C4.4375 14.1 2.75 13.1719 2.75 12C2.75 10.8281 4.41875 9.9375 4.87813 8.84063C5.3375 7.74375 4.74688 5.97187 5.60938 5.10938C6.47187 4.24688 8.28125 4.81875 9.34063 4.37813C10.4 3.9375 11.3281 2.25 12.5 2.25C13.6719 2.25 14.5625 3.91875 15.6594 4.37813C16.7562 4.8375 18.5281 4.24688 19.3906 5.10938C20.2531 5.97187 19.6812 7.78125 20.1219 8.84063C20.5625 9.9 22.25 10.8281 22.25 12C22.25 13.1719 20.5813 14.0625 20.1219 15.1594C19.6625 16.2562 20.2531 18.0281 19.3906 18.8906C18.5281 19.7531 16.7188 19.1812 15.6594 19.6219C14.6 20.0625 13.6719 21.75 12.5 21.75C11.3281 21.75 10.4375 20.0813 9.34063 19.6219C8.24375 19.1625 6.47187 19.7531 5.60938 18.8906Z\" fill=\"#ffffff\" stroke=\"#255aad\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path><path d=\"M16.625 9.75L11.1219 15L8.375 12.375\" stroke=\"#255aad\" stroke-width=\"1.4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><\/path><\/svg>\n              <span class=\"scaler-placement__stat-desc\">Verified data<\/span>\n            <\/div>\n          <\/div>\n\n          <a class=\"scaler-placement__cta\" href=\"https:\/\/d2beiqkhq929f0.cloudfront.net\/public_assets\/assets\/000\/195\/869\/original\/Scaler_Career_Report.pdf?1778499863\" target=\"_blank\" rel=\"noopener\">\n            See full placement report\n            <svg viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/a>\n        <\/div>\n      <\/div>\n\n      <div class=\"scaler-hiring\">\n        <span class=\"scaler-hiring__label\">Hiring Partners:<\/span>\n        <div class=\"scaler-hiring__pills\">\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/googleicon_.svg\" alt=\"Google\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Google<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/amazonicon_.svg\" alt=\"Amazon\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Amazon<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/microsoft.svg\" alt=\"Microsoft\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Microsoft<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/flipkarticon_.svg\" alt=\"Flipkart\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Flipkart<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__pill\">\n            <span class=\"scaler-hiring__badge\"><img decoding=\"async\" class=\"scaler-hiring__logo\" src=\"https:\/\/d19zaobb0foqu6.cloudfront.net\/topics\/images\/adobeicon_.svg\" alt=\"Adobe\" loading=\"lazy\"><\/span>\n            <span class=\"scaler-hiring__name\">Adobe<\/span>\n          <\/span>\n          <span class=\"scaler-hiring__more\">1200+ more<\/span>\n        <\/div>\n      <\/div>\n    <\/div>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-2-go-projects-that-use-concurrency\"><\/span><strong>Tier 2: Go Projects That Use Concurrency<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Some applications need to deal with many pieces of work at the same time. A scraper might fetch hundreds of URLs. A file processor might handle thousands of files. A server might receive many requests while background jobs are still running. This is where golang concurrency features are used.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The four golang projects in this tier give you those kinds of problems to solve. You\u2019ll use goroutines to run work concurrently, channels to coordinate that work, and cancellation to stop it when it is no longer needed.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There\u2019s also an important part of writing concurrent Go code: you need to control how much work runs at once. Starting a goroutine for every task may work for a small test, but it can overwhelm the system when the workload grows. The golang project ideas below give you opportunities to set those limits and see why they matter.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>5. A Concurrent Web Scraper with a Bounded Worker Pool<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a crawler that starts with a set of seed URLs, fetches pages concurrently, extracts links, and keeps track of URLs it has already visited. Give it a fixed number of workers so you can control how many requests run at once. Add robots.txt checks, per-host rate limits, and structured output as you extend it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> A web scraper needs to fetch many URLs without letting the number of requests grow without limit. You can use a worker pool to process URLs, a buffered channel as a semaphore to limit in-flight requests, sync.WaitGroup to track completed work, and a mutex to protect the visited-URL set. Use context cancellation to stop the crawl when it needs to end.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> net\/http, sync, context, golang.org\/x\/sync\/semaphore, PuerkitoBio\/goquery or gocolly\/colly<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 2 weeks<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> controlling concurrent work instead of creating unlimited goroutines, coordinating workers, protecting shared state, and handling failures without leaving work running in the background.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can test it by deliberately giving the scraper more URLs than it can process at once. You should be able to see that the worker limit actually controls the number of concurrent requests rather than simply creating a goroutine for every URL.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, keep the robots.txt and per-host rate-limit checks. They make the scraper behave more like a tool you could actually run against public sites, rather than just a concurrency exercise.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>6. A Rate Limiter You Can Drop Into Any HTTP Service<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a rate limiter as net\/http middleware and support both token-bucket and sliding-window approaches. Start with per-IP limits, then add per-API-key limits and a Redis-backed version that can work across multiple service instances.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> rate limiting makes you deal with shared state and timing while requests are arriving concurrently. You\u2019ll work with time, select, and mutexes in the in-process version. Then, when you move the state to Redis, you\u2019ll see why a limiter that works on one server cannot simply be copied across three replicas behind a load balancer.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> golang.org\/x\/time\/rate, sync, time, net\/http, redis\/go-redis<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 2 weeks<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> concurrency in golang state management, HTTP middleware, rate-limiting algorithms, and the difference between a limiter that works on one instance and one that has to coordinate across multiple instances. Rate limiting also comes up regularly in system-design interviews, so having implemented one gives you something concrete to discuss alongside a <a href=\"https:\/\/www.scaler.com\/blog\/system-design-roadmap-2026-complete-guide-from-beginner-to-advanced\/\">system design roadmap<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here\u2019s how you can compare the algorithms by looking at how they handle bursts and how much state they need:<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Algorithm<\/strong><\/td><td><strong>Burst behaviour<\/strong><\/td><td><strong>Memory cost<\/strong><\/td><td><strong>When to use<\/strong><\/td><\/tr><tr><td>Token bucket<\/td><td>Allows controlled bursts<\/td><td>1 key (2 fields)<\/td><td>Bursty traffic with average-rate limits<\/td><\/tr><tr><td>Leaky bucket<\/td><td>No bursts; steady drain<\/td><td>1 key (1 - 2 fields)<\/td><td>Policing or shaping traffic<\/td><\/tr><tr><td>Fixed window<\/td><td>Allows up to 2\u00d7 burst at boundaries<\/td><td>1 key<\/td><td>Simple API limits<\/td><\/tr><tr><td>Sliding window<\/td><td>No boundary bursts<\/td><td>O(n) entries<\/td><td>When exact request tracking matters<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">A <strong>key<\/strong> is a Redis entry used to store the limiter's state for a client. \u201c2 fields\u201d means that one key contains two pieces of state. <strong>O(n) entries<\/strong> means the memory grows with the number of requests being tracked in the window, so a busy client requires more storage&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>7. A Concurrent File Processing Pipeline<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a batch processor for a task such as thumbnail generation, log parsing, or CSV-to-database ingestion. Break the work into separate stages and connect those stages with channels. If one stage encounters an error, cancel the rest of the pipeline instead of allowing the other stages to keep processing.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> the pipeline gives you a practical way to work with channels and the fan-out\/fan-in pattern. You can run several workers for a stage, combine their results in the next stage, and use errgroup with context to cancel the pipeline when one of those workers fails.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> golang.org\/x\/sync\/errgroup, context, image or encoding\/csv, bufio, sync<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 2 weeks<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> composing several concurrent stages, coordinating workers, handling cancellation, and managing backpressure so that one stage does not keep producing data faster than the next stage can process it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>8. A Background Job Queue with Retries and a Dead-Letter Queue<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a job queue that stores jobs in Redis or Postgres and has a pool of workers processing them. Add retries with exponential backoff for failed jobs, move jobs that keep failing to a dead-letter queue (DLQ), and make sure SIGTERM lets workers finish in-flight jobs before the service exits.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because<\/strong> you have several pieces of backend behaviour to handle together: a worker pool for processing jobs, context for cancellation, retries for temporary failures, and graceful shutdown when the service is stopped. You\u2019ll also need to think about <strong>at-least-once delivery<\/strong>, where the same job may be processed more than once.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Intermediate - Advanced<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> hibiken\/asynq or go-redis, context, os\/signal, sync, log\/slog<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 2.5 - 3 weeks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> how you handle failures in a background service. You\u2019ll need to decide when a job should be retried, what happens to a job that keeps failing, how to make repeated processing safe through idempotency, and how to shut down without dropping work.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Build the worker pool yourself first, so you understand what happens when jobs are added, picked up, retried, and completed. Then try the same setup with asynq and compare the two implementations. Look at which parts asynq takes care of, such as worker management, retries, and job state, and which decisions still belong to your application. This will give you a better understanding of the library.<\/p>\n\n\n<meta charset=\"UTF-8\">\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\n    <!-- Source Sans Pro (topics font) -->\n    <link href=\"https:\/\/fonts.googleapis.com\/css2?family=Source+Sans+3:wght@400;600;700&amp;display=swap\" rel=\"stylesheet\">\n    <link rel=\"stylesheet\" href=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.css\">\n    <script src=\"https:\/\/cdn.jsdelivr.net\/npm\/swiper@11\/swiper-bundle.min.js\"><\/script>\n\n    <style>\n      :root {\n        --ss-primary: #005bb3;        \/* primary-color-80 *\/\n        --ss-card-bg: #ffffff;\n        --ss-border: #e6e6e6;\n        --ss-quote-bg: #f6f6f6;\n        --ss-text-dark: #1c1c1c;\n        --ss-text-mid: #6b6b6b;\n        --ss-text-muted: #9a9a9a;\n        --ss-radius: 12px;\n        --ss-radius-sm: 8px;\n        --ss-shadow: 0 8px 16px 0 rgba(50, 71, 102, 0.16);\n      }\n\n      .scaler-ss * { box-sizing: border-box; }\n\n      .scaler-ss {\n        font-family: \"Source Sans 3\", \"Source Sans Pro\", \"Roboto\", Arial, sans-serif;\n        padding: 24px;\n        width: 100%;\n      }\n      .scaler-ss__inner {\n        max-width: 1000px;\n        margin: 0 auto;\n        position: relative;\n        width: 100%;\n      }\n\n      \/* Heading *\/\n      .scaler-ss__heading {\n        font-size: 26px;\n        line-height: 34px;\n        font-weight: 700;\n        margin: 0 0 16px;\n        text-align: center;\n        color: var(--ss-text-dark);\n      }\n\n      \/* Swiper *\/\n      .scaler-ss__swiper-wrap { position: relative; }\n      .scaler-ss .swiper { width: 100%; padding: 4px; }\n      .scaler-ss-swiper .swiper-slide {\n        width: 300px;          \/* topics card width *\/\n        height: auto;\n        display: flex;\n      }\n\n      \/* Card *\/\n      .scaler-ss-card {\n        display: flex;\n        flex-direction: column;\n        width: 100%;\n        border: 1px solid var(--ss-border);\n        border-radius: var(--ss-radius);\n        overflow: hidden;\n        background: var(--ss-card-bg);\n      }\n\n      .scaler-ss-card__hike {\n        padding: 8px 12px;\n        background: var(--ss-primary);\n        color: #ffffff;\n        font-size: 14px;\n        font-weight: 700;\n        text-align: center;\n        letter-spacing: 0.4px;\n      }\n\n      .scaler-ss-card__body {\n        display: flex;\n        flex: 1 1 auto;\n        flex-direction: column;\n        gap: 12px;\n        padding: 16px;\n      }\n\n      \/* Person *\/\n      .scaler-ss-card__person {\n        display: flex;\n        align-items: center;\n        gap: 10px;\n      }\n      .scaler-ss-card__avatar {\n        width: 44px;\n        height: 44px;\n        min-width: 44px;\n        border-radius: 50%;\n        object-fit: cover;\n        background: var(--ss-quote-bg);\n      }\n      .scaler-ss-card__name {\n        font-size: 16px;\n        font-weight: 700;\n        line-height: 20px;\n        color: var(--ss-text-dark);\n      }\n      .scaler-ss-card__city {\n        font-size: 13px;\n        line-height: 18px;\n        color: var(--ss-text-mid);\n      }\n\n      \/* Before \/ Now transition *\/\n      .scaler-ss-card__transition {\n        display: flex;\n        align-items: center;\n        justify-content: space-between;\n        gap: 8px;\n      }\n      .scaler-ss-card__col {\n        flex: 1;\n        min-width: 0;\n      }\n      .scaler-ss-card__col-label {\n        font-size: 11px;\n        font-weight: 600;\n        letter-spacing: 0.4px;\n        color: var(--ss-text-muted);\n        margin-bottom: 2px;\n      }\n      .scaler-ss-card__col-role {\n        font-size: 13px;\n        line-height: 18px;\n        color: var(--ss-text-mid);\n      }\n      .scaler-ss-card__col-company {\n        font-size: 14px;\n        font-weight: 700;\n        line-height: 20px;\n        color: var(--ss-text-dark);\n      }\n      .scaler-ss-card__company-logo {\n        margin-top: 2px;\n        max-width: 64px;\n        max-height: 20px;\n        width: auto;\n        height: auto;\n        object-fit: contain;\n        display: block;\n      }\n      .scaler-ss-card__arrow {\n        flex-shrink: 0;\n        width: 28px;\n        height: 8px;\n        color: var(--ss-text-mid);\n        fill: currentColor;\n      }\n\n      \/* Quote *\/\n      .scaler-ss-card__quote {\n        font-size: 13px;\n        font-style: italic;\n        line-height: 19px;\n        color: var(--ss-text-mid);\n        background: var(--ss-quote-bg);\n        border-radius: var(--ss-radius-sm);\n        padding: 8px 10px;\n      }\n\n      \/* View Profile *\/\n      .scaler-ss-card__cta,\n      .scaler-ss-card__cta:link,\n      .scaler-ss-card__cta:visited {\n        display: block;\n        margin-top: auto;\n        text-align: center;\n        font-size: 14px;\n        font-weight: 600;\n        color: var(--ss-primary) !important;\n        text-decoration: none;\n        border: 1px solid var(--ss-primary);\n        border-radius: var(--ss-radius-sm);\n        padding: 9px 12px;\n        cursor: pointer;\n        transition: background 0.2s ease, color 0.2s ease;\n      }\n      .scaler-ss-card__cta:hover,\n      .scaler-ss-card__cta:focus {\n        background: var(--ss-primary);\n        color: #ffffff !important;\n      }\n\n      \/* Side navigation arrows *\/\n      .scaler-ss__nav {\n        position: absolute !important;\n        top: 50% !important;\n        transform: translateY(-50%) !important;\n        z-index: 2;\n        width: 46px !important;\n        height: 46px !important;\n        min-width: 46px;\n        display: flex !important;\n        align-items: center;\n        justify-content: center;\n        padding: 0 !important;\n        background: var(--ss-card-bg) !important;\n        border: none !important;\n        border-radius: var(--ss-radius-sm) !important;\n        box-shadow: var(--ss-shadow) !important;\n        color: #61738e !important;\n        cursor: pointer;\n        transition: opacity 0.2s ease, visibility 0.2s ease;\n      }\n      .scaler-ss__nav--prev { left: 8px !important; }\n      .scaler-ss__nav--next { right: 8px !important; }\n      .scaler-ss__nav svg {\n        width: 20px !important;\n        height: 20px !important;\n        fill: #61738e !important;\n      }\n      .scaler-ss__nav.swiper-button-disabled {\n        opacity: 0;\n        visibility: hidden;\n        pointer-events: none;\n      }\n\n      .scaler-ss .swiper-button-prev,\n      .scaler-ss .swiper-button-next,\n      .scaler-ss .swiper-pagination { display: none; }\n\n      \/* Skeleton *\/\n      .scaler-ss-card--skeleton { pointer-events: none; }\n      .scaler-ss-card--skeleton .scaler-ss-card__hike,\n      .scaler-ss-card--skeleton .scaler-ss-card__avatar,\n      .scaler-ss-card--skeleton .scaler-ss-card__person-text,\n      .scaler-ss-card--skeleton .scaler-ss-card__transition,\n      .scaler-ss-card--skeleton .scaler-ss-card__quote,\n      .scaler-ss-card--skeleton .scaler-ss-card__cta {\n        background: linear-gradient(90deg, var(--ss-border) 25%, var(--ss-quote-bg) 50%, var(--ss-border) 75%);\n        background-size: 200% 100%;\n        animation: ss-shimmer 1.5s infinite;\n        color: transparent !important;\n        border-color: transparent !important;\n        border-radius: 4px;\n      }\n      .scaler-ss-card--skeleton .scaler-ss-card__person-text { flex: 1; height: 32px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__transition { height: 56px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__quote { height: 48px; }\n      .scaler-ss-card--skeleton .scaler-ss-card__cta { height: 38px; }\n\n      @keyframes ss-shimmer {\n        0% { background-position: 200% 0; }\n        100% { background-position: -200% 0; }\n      }\n\n      @media (max-width: 768px) {\n        .scaler-ss { padding: 16px; }\n        .scaler-ss__heading { font-size: 22px; line-height: 30px; }\n        .scaler-ss-swiper .swiper-slide { width: 270px; }\n        .scaler-ss__nav { display: none !important; }\n      }\n    <\/style>\n\n\n\n    <div class=\"scaler-ss js-scaler-ss\">\n\n      <template class=\"js-ss-card-template\">\n        <div class=\"swiper-slide\">\n          <article class=\"scaler-ss-card\">\n            <div class=\"scaler-ss-card__hike js-ss-hike\"><\/div>\n            <div class=\"scaler-ss-card__body\">\n              <div class=\"scaler-ss-card__person\">\n                <img decoding=\"async\" class=\"scaler-ss-card__avatar js-ss-avatar\" src=\"\" alt=\"\" loading=\"lazy\">\n                <div class=\"scaler-ss-card__person-text\">\n                  <div class=\"scaler-ss-card__name js-ss-name\"><\/div>\n                  <div class=\"scaler-ss-card__city js-ss-city\"><\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"scaler-ss-card__transition\">\n                <div class=\"scaler-ss-card__col\">\n                  <div class=\"scaler-ss-card__col-label\">BEFORE:<\/div>\n                  <div class=\"scaler-ss-card__col-role js-ss-before-role\"><\/div>\n                  <div class=\"scaler-ss-card__col-company js-ss-before-company\"><\/div>\n                <\/div>\n                <svg class=\"scaler-ss-card__arrow\" viewBox=\"0 0 32 8\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\"><path d=\"M31.3882 4.35355C31.5835 4.15829 31.5835 3.84171 31.3882 3.64645L28.2062 0.464466C28.011 0.269204 27.6944 0.269204 27.4991 0.464466C27.3039 0.659728 27.3039 0.976311 27.4991 1.17157L30.3276 4L27.4991 6.82843C27.3039 7.02369 27.3039 7.34027 27.4991 7.53553C27.6944 7.7308 28.011 7.7308 28.2062 7.53553L31.3882 4.35355ZM0.034668 4.5H31.0347V3.5H0.034668V4.5Z\"><\/path><\/svg>\n                <div class=\"scaler-ss-card__col\">\n                  <div class=\"scaler-ss-card__col-label\">NOW:<\/div>\n                  <div class=\"scaler-ss-card__col-role js-ss-now-role\"><\/div>\n                  <div class=\"js-ss-now-company\"><\/div>\n                <\/div>\n              <\/div>\n\n              <div class=\"scaler-ss-card__quote js-ss-quote\"><\/div>\n\n              <a class=\"scaler-ss-card__cta js-ss-cta\" href=\"#\" target=\"_blank\" rel=\"noopener\">View Profile<\/a>\n            <\/div>\n          <\/article>\n        <\/div>\n      <\/template>\n\n      <div class=\"scaler-ss__inner\">\n        <h2 class=\"scaler-ss__heading\"><span class=\"ez-toc-section\" id=\"scaler-alumni-and-their-success-stories\"><\/span>Scaler Alumni and Their Success Stories<span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n        <div class=\"scaler-ss__swiper-wrap\">\n          <div class=\"swiper scaler-ss-swiper\">\n            <div class=\"swiper-wrapper js-ss-wrapper\"><\/div>\n          <\/div>\n\n          <button class=\"scaler-ss__nav scaler-ss__nav--prev js-ss-prev\" aria-label=\"Previous\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(-90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/button>\n          <button class=\"scaler-ss__nav scaler-ss__nav--next js-ss-next\" aria-label=\"Next\">\n            <svg fill=\"currentColor\" viewBox=\"0 0 32 32\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" style=\"transform: rotate(90deg);\"><path d=\"M5.313 16l10.688-10.688 10.688 10.688-1.938 1.875-7.438-7.438v16.25h-2.625v-16.25l-7.5 7.438z\"><\/path><\/svg>\n          <\/button>\n        <\/div>\n      <\/div>\n    <\/div>\n\n    <script>\n    document.addEventListener(\"DOMContentLoaded\", () => {\n\n      const ASSET_CDN = \"https:\/\/d2beiqkhq929f0.cloudfront.net\/public_assets\/assets\";\n      const AVATAR_FALLBACK =\n        \"data:image\/svg+xml,%3Csvg xmlns='http:\/\/www.w3.org\/2000\/svg' width='44' height='44' viewBox='0 0 44 44'%3E%3Ccircle cx='22' cy='22' r='22' fill='%23e6e6e6'\/%3E%3Ccircle cx='22' cy='17' r='7' fill='%23b9b9b9'\/%3E%3Cpath d='M8 40c0-8 6.3-13 14-13s14 5 14 13' fill='%23b9b9b9'\/%3E%3C\/svg%3E\";\n\n      \/\/ Mirrors buildAssetUrl(): pass through absolute urls, else build the CDN url.\n      function buildAssetUrl(raw) {\n        if (!raw) return \"\";\n        if (String(raw).startsWith(\"http\")) return raw;\n        return `${ASSET_CDN}\/${raw}\/original`;\n      }\n\n      const instances = document.querySelectorAll(\".js-scaler-ss\");\n\n      instances.forEach(container => {\n        if (container.dataset.initialized === \"true\") return;\n        container.dataset.initialized = \"true\";\n\n        const swiperElement = container.querySelector(\".scaler-ss-swiper\");\n        const wrapper = container.querySelector(\".js-ss-wrapper\");\n        const template = container.querySelector(\".js-ss-card-template\");\n        const nextBtn = container.querySelector(\".js-ss-next\");\n        const prevBtn = container.querySelector(\".js-ss-prev\");\n\n        if (!wrapper || !template) {\n          console.error(\"Scaler Success Stories: missing required elements\");\n          return;\n        }\n\n        const swiper = new Swiper(swiperElement, {\n          slidesPerView: \"auto\",\n          spaceBetween: 16,\n          grabCursor: true,\n          observer: true,\n          observeParents: true,\n          navigation: { nextEl: nextBtn, prevEl: prevBtn },\n        });\n\n        const pathParts = location.pathname.split(\"\/\").filter(Boolean);\n        const currentSlug = pathParts.length > 0 ? pathParts[pathParts.length - 1] : \"homepage\";\n        const profileUrl =\n          `https:\/\/www.scaler.com\/review\/?utm_source=blog&utm_medium=success_stories&utm_content=${currentSlug}`;\n\n        function showSkeletons(count = 4) {\n          wrapper.innerHTML = \"\";\n          for (let i = 0; i < count; i++) {\n            const clone = template.content.cloneNode(true);\n            clone.querySelector(\".scaler-ss-card\").classList.add(\"scaler-ss-card--skeleton\");\n            wrapper.appendChild(clone);\n          }\n          swiper.update();\n        }\n\n        function renderStories(stories) {\n          wrapper.innerHTML = \"\";\n          if (!stories.length) {\n            container.style.display = \"none\";   \/\/ match topics: render nothing when empty\n            return;\n          }\n\n          stories.forEach(story => {\n            const a = story.attributes || {};\n            const clone = template.content.cloneNode(true);\n\n            const hike = String(a.growth || \"\").replace(\"%\", \"\").trim() || \"150\";\n            clone.querySelector(\".js-ss-hike\").textContent = `${hike}% HIKE`;\n\n            \/\/ Avatar\n            const avatar = buildAssetUrl(a.image_url) || a.generated_thumbnail_url || \"\";\n            const img = clone.querySelector(\".js-ss-avatar\");\n            img.src = avatar || AVATAR_FALLBACK;\n            img.alt = a.name || \"Scaler alumnus\";\n            img.onerror = function () { this.onerror = null; this.src = AVATAR_FALLBACK; };\n\n            clone.querySelector(\".js-ss-name\").textContent = a.name || \"\";\n            const cityEl = clone.querySelector(\".js-ss-city\");\n            if (a.city) cityEl.textContent = a.city; else cityEl.style.display = \"none\";\n\n            \/\/ BEFORE\n            clone.querySelector(\".js-ss-before-role\").textContent = a.pre_scaler_role || a.pre_academy_company || \"\";\n            const beforeCompany = clone.querySelector(\".js-ss-before-company\");\n            if (a.pre_academy_company) beforeCompany.textContent = a.pre_academy_company;\n            else beforeCompany.style.display = \"none\";\n\n            \/\/ NOW\n            clone.querySelector(\".js-ss-now-role\").textContent = a.role || \"\";\n            const nowCompanyBox = clone.querySelector(\".js-ss-now-company\");\n            const companyLogo = buildAssetUrl(a.company_logo_url);\n            if (companyLogo) {\n              const logo = document.createElement(\"img\");\n              logo.className = \"scaler-ss-card__company-logo\";\n              logo.src = companyLogo;\n              logo.alt = a.post_academy_company || \"company\";\n              logo.loading = \"lazy\";\n              logo.onerror = function () {\n                this.onerror = null;\n                this.replaceWith(Object.assign(document.createElement(\"div\"), {\n                  className: \"scaler-ss-card__col-company\",\n                  textContent: a.post_academy_company || \"\",\n                }));\n              };\n              nowCompanyBox.appendChild(logo);\n            } else if (a.post_academy_company) {\n              nowCompanyBox.className = \"scaler-ss-card__col-company\";\n              nowCompanyBox.textContent = a.post_academy_company;\n            }\n\n            \/\/ Quote (clip to 110 chars like topics)\n            const quoteEl = clone.querySelector(\".js-ss-quote\");\n            quoteEl.textContent = `\u201c${String(a.content).slice(0, 110)}\u2026\u201d`;\n\n            \/\/ View Profile\n            clone.querySelector(\".js-ss-cta\").href = profileUrl;\n\n            wrapper.appendChild(clone);\n          });\n\n          swiper.update();\n          swiper.slideTo(0);\n        }\n\n        async function fetchStories() {\n          try {\n            showSkeletons();\n            \/\/ Same-origin POST on www.scaler.com (the blog canonical host).\n            \/\/ The endpoint only returns JSON when the Referer is a \/topics\/ page\n            \/\/ (a soft anti-hotlinking gate); a \/blog\/ referer gets a Turbolinks\n            \/\/ redirect. Since blog + topics are the same origin, we set the\n            \/\/ fetch referrer to a topics URL so the server serves the data.\n            const res = await fetch(\"\/success-stories\/testimonials\", {\n              method: \"POST\",\n              credentials: \"include\",\n              referrer: \"https:\/\/www.scaler.com\/topics\/\",\n              referrerPolicy: \"unsafe-url\",\n              headers: {\n                \"Content-Type\": \"application\/json\",\n                \"Accept\": \"application\/json\",\n                \"X-Requested-With\": \"XMLHttpRequest\",\n              },\n              \/\/ q:{} => all programs (no program filter)\n              body: JSON.stringify({\n                page_number: 1,\n                per_page: 12,\n                sort_by: \"eligible_for_qna\",\n                new_quick_filters: true,\n                quick_filter: [],\n                q: {},\n              }),\n            });\n            const json = await res.json();\n            const all = (json && json.data && json.data.data) || [];\n            \/\/ Only show stories that carry a testimonial quote (matches topics).\n            const withQuote = all.filter(s => s.attributes && s.attributes.content);\n            renderStories(withQuote);\n          } catch (error) {\n            console.error(\"Failed to load success stories:\", error);\n            container.style.display = \"none\";\n          }\n        }\n\n        fetchStories();\n      });\n    });\n    <\/script>\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"tier-3-systems-and-infrastructure-projects-advanced-golang-projects\"><\/span><strong>Tier 3: Systems and Infrastructure Projects (Advanced Golang Projects)<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The first two tiers covered Go fundamentals and concurrency in golang. Here, the projects move into systems and infrastructure work: networking, storage, processes, containers, and resource management.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The problems are a bit different here. You\u2019ll need to think about how the system uses CPU and memory, how processes communicate, how data is stored, and what happens when a component stops responding. These are the kinds of concerns that come up in infrastructure and platform work. So, get ready to now work on these golang project ideas!<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>9. An In-Memory Key-Value Store with TTL and Persistence (a Mini Redis)<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a small key-value store that supports GET, SET, DEL, and EXPIRE over a TCP connection. Use a simplified RESP protocol for communication, split the in-memory data across shards to reduce lock contention, and run a background goroutine to remove expired keys. Add append-only-file persistence so the store can replay its data after a restart.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> you can work directly with TCP connections using net.Conn, with one goroutine handling each connection. The data store also gives you a real choice between sync.Map and a sharded map protected by RWMutex. Instead of deciding based on theory, benchmark both approaches with go test -bench.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> net, bufio, sync, time, encoding\/binary, testing<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 3 - 4 weeks<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> choosing and evaluating concurrent data structures, working with TCP connections, handling expiry and persistence, and using benchmarks to support an engineering decision. Include the benchmark results in the README so the reader can see why you chose one implementation over the other.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>10. An HTTP Load Balancer with Health Checks<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a reverse proxy that sits in front of several backend servers and distributes requests between them. Start with round-robin routing, then add least-connections routing, background health checks, and atomic request counters. A backend that stops responding should be removed from the pool and added back once it becomes healthy again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> httputil.ReverseProxy handles the basic proxying, so you can spend your time on the routing logic and backend management. The interesting part is keeping the backend pool updated while requests are being routed through it. Health checks run in the background, while incoming requests need to see a consistent view of which backends are available.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> net\/http\/httputil, sync\/atomic, time, context, net\/http<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 3 weeks<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> reverse-proxy development, load-balancing strategies, health checks, concurrent state management, and atomic operations. It also gives you a practical way to understand what happens between a client request and the backend service handling it.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>11. A Real-Time Chat Server over WebSockets<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build a multi-room chat server where clients connect over WebSockets and can join rooms, send messages, and see who is online. Use a central hub to manage connected clients, separate read and write goroutines for each client, and channels to broadcast messages and handle disconnects.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> you can keep ownership of the connected-client registry in a single hub goroutine instead of having several goroutines access the same map. Other parts of the server communicate with the hub through channels. This gives you a practical example of Go\u2019s approach to managing shared state without putting a mutex around every operation.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> gorilla\/websocket or coder\/websocket, sync, context, encoding\/json<br><strong>Build time:<\/strong> 2.5 - 3 weeks.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> designing a concurrent server, managing long-lived connections, coordinating goroutines through channels, and handling clients that disconnect or stop consuming messages.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">There is one case you should account for in the design: what happens when one client is too slow to receive a broadcast? Give each client a buffered send channel so a slow connection does not hold up the entire broadcast. If that buffer fills up, you can drop messages or disconnect the client, depending on the behaviour you want from the application.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>12. A gRPC Microservice Pair with Observability<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Build two services that communicate over gRPC using Protocol Buffers. For example, an order service can call an inventory service. Add interceptors for logging and authentication, propagate deadlines between the services, and add structured logs plus Prometheus metrics or OpenTelemetry traces. Finish with a docker compose up setup that starts both services.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Go is a good fit here because:<\/strong> gRPC and Protocol Buffers are widely used with Go, and the project lets you work through problems that appear when services communicate with each other. In particular, you\u2019ll see why context deadlines need to travel across service boundaries. If the inventory service takes too long to respond, the order service should not keep waiting after its own deadline has expired.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Difficulty:<\/strong> Advanced<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key packages:<\/strong> google.golang.org\/grpc, protoc-gen-go, grpc-ecosystem\/go-grpc-middleware, log\/slog, go.opentelemetry.io\/otel<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Build time:<\/strong> 3 - 4 weeks<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>What it demonstrates:<\/strong> building and operating a service rather than only writing its business logic. You\u2019ll have to deal with service-to-service communication, deadlines, authentication, logs, metrics, traces, and local deployment.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to take the infrastructure side further, a natural next project is a small Kubernetes controller or a kubectl plugin using client-go. You can continue with this <a href=\"https:\/\/www.scaler.com\/blog\/kubernetes-roadmap\/\">Kubernetes roadmap<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"the-production-ready-checklist-what-actually-separates-a-portfolio-repo-from-a-tutorial-repo\"><\/span><strong>The Production-Ready Checklist: What Actually Separates a Portfolio Repo from a Tutorial Repo<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In all honesty, you can find versions of almost every go projects above on GitHub, so building the basic version alone might not tell someone much about how you work.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So, before adding another project, take one of your existing ones and go through this checklist below. These are small additions individually, but together they show that you understand what it takes to run and maintain Go code and a good golang project structure.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Practice<\/strong><\/td><td><strong>What it Shows<\/strong><\/td><td><strong>How to add it to any project on this list<\/strong><\/td><\/tr><tr><td><strong>Wrapped, typed errors<\/strong><\/td><td>Good error handling keeps the original cause available when something fails.<\/td><td>Return errors instead of panicking outside main. Wrap them with fmt.Errorf(\"fetching user %d: %w\", id, err). Define sentinel errors such as ErrNotFound and check them with errors.Is \/ errors.As.<\/td><\/tr><tr><td><strong>context.Context<\/strong> <strong>propagation<\/strong><\/td><td>A request that waits indefinitely can hold resources and keep dependent work running.<\/td><td>Pass ctx context.Context as the first parameter to functions that perform I\/O. Set deadlines on outbound HTTP and database calls. Don\u2019t store contexts in structs.<\/td><\/tr><tr><td><strong>Graceful shutdown<\/strong><\/td><td>A service should be able to stop without dropping requests or background work that is already in progress.<\/td><td>Use signal.NotifyContext(ctx, os.Interrupt, syscall.SIGTERM) and call srv.Shutdown(ctx) with a timeout. For workers, stop accepting new jobs, finish in-flight work, then exit.<\/td><\/tr><tr><td><strong>Structured logging<\/strong><\/td><td>Structured logs let you search and filter events when a service is handling many requests.<\/td><td>Use log\/slog and log key-value pairs such as request IDs, user IDs, and errors. Log important events at the application boundaries instead of adding logs to every function.<\/td><\/tr><tr><td><strong>Externalised config<\/strong><\/td><td>Ports, credentials, and environment-specific settings should not be embedded in your source code.<\/td><td>Use environment variables with flag overrides. Add a .env.example, never commit .env, and fail clearly when required configuration is missing.<\/td><\/tr><tr><td><strong>Table-driven tests +<\/strong> <strong>-race<\/strong><\/td><td>Table-driven tests are idiomatic Go, while the race detector can catch unsafe concurrent access that ordinary tests may miss.<\/td><td>Define test cases as []struct{...} and run each with t.Run(tc.name, ...). Run go test -race .\/... in CI. Focus coverage on important behaviour rather than chasing 100%.<\/td><\/tr><tr><td><strong>Standard project layout<\/strong><\/td><td>A familiar structure makes a Go repository easier for another developer to navigate.<\/td><td>Keep entry points in cmd\/&lt;binary&gt;\/main.go, private application packages in internal\/, and main thin. Don\u2019t add a large directory structure just because you found a \u201cstandard Go layout\u201d online.<\/td><\/tr><tr><td><strong>Multi-stage Dockerfile<\/strong><\/td><td>A smaller runtime image reduces the amount of software shipped with your application.<\/td><td>Compile in a golang:1.x build stage and copy the binary into a gcr.io\/distroless\/static or scratch image. Use CGO_ENABLED=0, run as non-root, and add a health check where appropriate.<\/td><\/tr><tr><td><strong>CI pipeline<\/strong><\/td><td>Your code should build and pass its tests on a clean machine, not only on your laptop.<\/td><td>Use GitHub Actions to run go vet, golangci-lint, go test -race .\/..., and go build on every push.<\/td><\/tr><tr><td><strong>A real README<\/strong><\/td><td>Someone reviewing your repository needs to understand the project before they start reading the code.<\/td><td>Explain what it does, why you built it, how to run it, and include an architecture diagram. Add a <strong>design decisions &amp; trade-offs<\/strong> section so you can explain why you chose one approach over another.<\/td><\/tr><tr><td><strong>Health &amp; readiness endpoints<\/strong><\/td><td>These endpoints let you distinguish between a process that is running and a service that is actually ready to receive traffic.<\/td><td>Add \/healthz for process health and \/readyz for dependency readiness.<\/td><\/tr><tr><td><strong>Makefile or<\/strong> <strong>just<\/strong> <strong>file<\/strong><\/td><td>A simple command to run, test, lint, or build the project removes unnecessary setup for anyone reviewing it.<\/td><td>Add commands such as make run, make test, make lint, and make docker.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">You\u2019ll be able to understand Graceful shutdown when you can see the sequence: stop accepting new work, give existing requests time to finish, then exit.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">defer stop()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">srv := &amp;http.Server{Addr: \":8080\"}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">go func() {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&lt;-ctx.Done()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;defer cancel()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;srv.Shutdown(shutdownCtx)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">if err := srv.ListenAndServe(); err != nil &amp;&amp; err != http.ErrServerClosed {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;log.Fatal(err)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For go projects with concurrent code, also make the tests exercise the cases where goroutines interact with each other. A small table-driven test can keep those cases easy to add and compare:&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">tests := []struct {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;name string<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;in &nbsp; string<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;want string<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}{<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;{\"existing key\", \"name\", \"Go\"},<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;{\"missing key\", \"unknown\", \"\"},<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">for _, tc := range tests {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;t.Run(tc.name, func(t *testing.T) {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;got := store.Get(tc.in)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if got != tc.want {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;t.Errorf(\"got %q, want %q\", got, tc.want)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;})<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Run the concurrent tests with:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">go test -race .\/...<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For containerisation, a multi-stage build keeps the Go toolchain out of the final image. The first stage compiles the application; the second contains only what is needed to run it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FROM golang:1.24 AS build<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">WORKDIR \/app<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">COPY go.mod go.sum .\/<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RUN go mod download<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">COPY . .<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">RUN CGO_ENABLED=0 go build -o server .\/cmd\/server<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">FROM gcr.io\/distroless\/static<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">COPY --from=build \/app\/server \/server<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">ENTRYPOINT [\"\/server\"]<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the multi-stage Dockerfile row, if you\u2019re not familiar with multi-stage builds yet, you can start with these <a href=\"https:\/\/www.scaler.com\/blog\/docker-roadmap\/\">containerisation fundamentals<\/a> before applying it to your project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You don\u2019t need to apply this checklist to every repository you have. Take the project that you think you\u2019ve given your best and spend a weekend bringing it through all twelve areas. Then pin that repository to your GitHub profile.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">These practices also carry over to the wider <a href=\"https:\/\/www.scaler.com\/blog\/backend-developer-skills\/\">skill set backend teams hire for<\/a>, so the work you put into one Go project does not stay limited to Go.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"the-concurrency-patterns-behind-these-golang-projects\"><\/span><strong>The Concurrency Patterns Behind These Golang Projects<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">As you build these projects, you\u2019ll run into the same kinds of golang concurrency problems repeatedly: too many goroutines doing the same work, several stages that need to run at the same time, shared state that needs protection, or work that needs to stop when its caller is cancelled.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go has established patterns for handling each of these problems. The table below connects those patterns to the projects in this guide, so you can see what problem each one solves and where you can practise it.&nbsp;<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>Pattern<\/strong><\/td><td><strong>What problem it solves<\/strong><\/td><td><strong>Which project uses it<\/strong><\/td><\/tr><tr><td><strong>Worker pool<\/strong><\/td><td>Limits the number of goroutines working at once so you don\u2019t overwhelm memory, file descriptors, or the service you\u2019re calling.<\/td><td>5 Web Scraper, 8 Job Queue<\/td><\/tr><tr><td><strong>Fan-out \/ fan-in<\/strong><\/td><td>Sends work to multiple goroutines and brings their results back together.<\/td><td>7 Processing Pipeline<\/td><\/tr><tr><td><strong>Pipeline (staged channels)<\/strong><\/td><td>Moves data through separate stages without loading the entire dataset into memory at once. Each stage can work concurrently.<\/td><td>7 Processing Pipeline<\/td><\/tr><tr><td><strong>Semaphore<\/strong> (buffered channel or x\/sync\/semaphore)<\/td><td>Limits access to a particular resource, such as connections, API requests, or disk I\/O, separately from the number of workers.<\/td><td>5 Web Scraper, 10 Load Balancer<\/td><\/tr><tr><td><strong>Context cancellation &amp; deadlines<\/strong><\/td><td>Stops work when the request that started it has been cancelled, or its deadline has passed.<\/td><td>3 API Client, 8 Job Queue, 12 gRPC Services<\/td><\/tr><tr><td><strong>select<\/strong> <strong>+<\/strong> <strong>time. Ticker\/time.After<\/strong><\/td><td>Handles timeouts, repeated tasks, and multiple channels without waiting forever on one of them.<\/td><td>6 Rate Limiter, 10 Load Balancer<\/td><\/tr><tr><td><strong>Mutex vs channel<\/strong><\/td><td>A mutex protects shared data; a channel can be used when goroutines need to pass work or ownership between each other.<\/td><td>2 URL Shortener, 11 Chat Server<\/td><\/tr><tr><td><strong>errgroup<\/strong><\/td><td>Runs related goroutines together and cancels the remaining work when one returns an error.<\/td><td>7 Processing Pipeline<\/td><\/tr><tr><td><strong>Single-owner goroutine (hub)<\/strong><\/td><td>Gives one goroutine ownership of shared state so other goroutines communicate with it through channels instead of locking the state directly.<\/td><td>11 Chat Server<\/td><\/tr><tr><td><strong>Graceful shutdown<\/strong><\/td><td>Lets in-flight work finish before a service exits after receiving SIGTERM.<\/td><td>2 URL Shortener, 8 Job Queue, 11 Chat Server<\/td><\/tr><tr><td><strong>sync\/atomic<\/strong><\/td><td>Updates simple counters and flags safely without taking a mutex, which can matter on frequently accessed paths.<\/td><td>10 Load Balancer<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>One thing to watch for: goroutine leaks<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Every goroutine you start needs a way to stop. A goroutine that keeps waiting on a channel, timer, network operation, or other work after nobody needs its result is a <strong>goroutine leak<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">When testing concurrent code, go test -race .\/... can catch unsafe memory access, while checking runtime.NumGoroutine() before and after a test can help spot goroutines that were left running. Neither catches every possible leak, but both are useful checks when you\u2019re testing concurrent code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can take the example of a worker because it shows the main idea behind <strong>bounded concurrency<\/strong> without adding much code:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">jobs := make(chan Job)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">var wg sync.WaitGroup<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">for i := 0; i &lt; 5; i++ {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;wg.Add(1)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;go func() {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;defer wg.Done()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for job := range jobs {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;process(job)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;}()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">for _, job := range jobsToProcess {<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&nbsp;&nbsp;&nbsp;&nbsp;jobs &lt;- job<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">}<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">close(jobs)<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">wg.Wait()<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Here, only five workers can process jobs at the same time. The jobs channel provides the work queue, WaitGroup lets the main goroutine wait for all workers to finish, and closing the channel tells the workers that no more jobs are coming.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"where-go-is-actually-hired-for-in-india\"><\/span><strong>Where Go Is Actually Hired For in India<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Go is used across Indian engineering teams, but its presence is more concentrated than Java, Python, JavaScript, and several other widely used languages. When you look at Golang jobs, you\u2019ll be able to find more opportunities in areas like infrastructure, backend systems, developer tooling, and services operating at scale. Let\u2019s look at the areas where you can find Golang developer jobs and what the work usually involves.&nbsp;<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Infrastructure, DevTools and Platform Engineering<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">If you look at where Go is used, infrastructure is one of the first areas you\u2019ll come across. Kubernetes, Docker, and Terraform are prominent examples from the Go ecosystem, and the language is widely used for cloud and developer tooling.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The <a href=\"https:\/\/go.dev\/blog\/survey2025\" target=\"_blank\" rel=\"noopener\">2025 Go Developer Survey<\/a> found that 91% of developers are satisfied with Go. CLI applications and API services were the most common use cases, with 55% of respondents saying they build both.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So when you search for Go roles, don't limit yourself to titles that say Golang Developer. Look for platform engineering, cloud infrastructure, developer tools, backend infrastructure, and SRE-related roles as well.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Backend Services and Distributed Systems<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can also find Go in regular backend engineering, particularly when the service involves a lot of network communication, concurrent work, or communication between multiple services.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That doesn't mean every high-scale backend is written in Go. Java, Kotlin, C++, Python, and other languages are widely used for the same kinds of systems. The point is that Go tends to appear more often when the backend work has a strong systems or infrastructure component.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The survey also shows that 81% of respondents had more professional development experience than Go-specific experience, and more than 80% reported learning Go after they had already started their professional careers.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you're learning Go now, you therefore don't need to think of it as a language that has to replace everything else you know. Your existing backend experience can be what makes the Go skill relevant.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Fintech and Payments<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">You can also find Go in fintech and payment engineering, particularly around services that handle large numbers of requests or transactions.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go isn't the default language for fintech in India. Java, Kotlin, C++, Python, and other languages have a major presence too. But if you're looking at Golang developer roles in this sector, you'll often find the language attached to backend services, transaction systems, infrastructure, or other high-throughput workloads.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Consumer-Scale Products<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Go also appears in consumer products where a service has to handle many concurrent connections or requests. Streaming, commerce, social products, and gaming can all have this kind of workload. If you look at a service such as a chat system, for example, thousands of users may be connected at the same time, and the server needs to keep those connections active without creating a heavy OS thread for every user. When you come across a Go role for this kind of service, you\u2019ll likely be working with keeping connections alive, coordinating work between them, and making sure the service continues to respond as the number of users grows.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>What Should You Expect From the Go Job Market?<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now, when the job market is in question, for golang jobs India has openings that are actually a bit harder to find than other popular languages. But you can also find Go in roles with a fairly specific technical focus.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And this also means that your experience and their requirements here would count a lot. If you're searching for your first job, you may find more entry-level options by keeping your search broader across backend development, and a golang internship can also be one route into the language if you find a team willing to take on someone early in their career. As you gain experience, you can narrow your search to teams using Go for infrastructure, distributed systems, platform engineering, or high-concurrency backend services. As you gain experience, you can look specifically for teams using Go for infrastructure, distributed systems, platform engineering, or high-concurrency backend services.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Also, in terms of golang developer salary, the average pay according to <a href=\"https:\/\/in.indeed.com\/career\/golang-developer\/salaries\/Maharashtra\" target=\"_blank\" rel=\"noopener\">Indeed<\/a> is \u20b98,30,000+ LPA in Maharashtra. Keep in mind that salaries vary depending on the company and location.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to understand more about the differences in salaries, then you can look at <a href=\"https:\/\/www.scaler.com\/blog\/software-developer-salary\/\">how backend pay scales with experience in India<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">And if you're wondering why so many Go openings ask for prior experience, look at <a href=\"https:\/\/www.scaler.com\/blog\/sde-1-vs-sde-2-vs-sde-3-understand-sde-level-differences\/\">SDE-1 vs SDE-2 vs SDE-3 expectations<\/a>. It\u2019ll give you a better idea of how the responsibilities change as you move into the kinds of roles where Go is usually required.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you're starting out, you don't need to choose Go over every other backend language just yet. Build your backend fundamentals first. Once you have them, Go can give you a path into infrastructure, platform engineering, and distributed-systems roles.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"how-to-present-a-go-project-on-your-resume-and-github\"><\/span><strong>How to present a Go project on your resume and GitHub<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">It\u2019s confusing, right? Your golang projects for resume need to be short, but these projects can cover a page full of description. Worry not; your one-line description can completely work because it\u2019s the repository where you show the technical work done.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you built the web scraper, for example, record the things you actually tested while building it:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>the number of workers<\/li>\n\n\n\n<li>requests per second or pages processed<\/li>\n\n\n\n<li>what happened when you increased the worker count<\/li>\n\n\n\n<li>how you handled a slow or failed request<\/li>\n\n\n\n<li>whether go test -race found anything<\/li>\n\n\n\n<li>how you stopped the workers when the crawl ended<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">If you benchmarked the project, put the command and result in the README. Go's benchmarking support gives you a standard way to measure this, and the output can report values such as ns\/op.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For concurrent projects, run:<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">go test -race .\/...<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">golang projects such as the URL shortener, scraper, job queue, and chat server have multiple goroutines accessing shared data, so run go test -race .\/... as part of your tests. A passing race-detector run does not mean the code has no data races. It only reports races that occur while the tests are running, so the tests need to exercise the concurrent operations in your code.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Do the same with design decisions. If you change the worker count after a benchmark, keep both the old and new result. If you moved from an in-memory queue to Redis, explain what problem that solved. If you replaced a single mutex with sharded state, show the benchmark that made you change it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">That gives you material for the resume too.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Instead of: Built a web scraper in Golang.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">You can write: Concurrent crawler processing 500 pages\/min with a bounded 20-worker pool and tested with go test -race.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Only use the 500 pages\/min if you have measured it.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For golang projects github, you don't need to worry about overcrowding your space. GitHub currently lets you pin repositories on your profile, and its own guidance recommends using pinned projects to direct attention to selected work and add your best golang projects for the interviewers to check.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>The follow-up golang interview questions each project invites<\/strong><\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Now take the golang project you have actually built and try to break your own design.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Web scraper<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What happens if 20 workers become 100?<\/li>\n\n\n\n<li>At what point does adding workers stop improving throughput?<\/li>\n\n\n\n<li>What happens when one request hangs?<\/li>\n\n\n\n<li>How does cancellation reach every worker?<\/li>\n\n\n\n<li>How are duplicate URLs prevented?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Rate limiter<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What happens when the service runs on three machines?<\/li>\n\n\n\n<li>Where is the rate-limit state stored?<\/li>\n\n\n\n<li>What happens when one instance restarts?<\/li>\n\n\n\n<li>Why did you choose a token bucket or sliding window?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Job queue<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What happens if a worker dies halfway through a job?<\/li>\n\n\n\n<li>Can the same job be processed twice?<\/li>\n\n\n\n<li>How does the consumer handle that?<\/li>\n\n\n\n<li>When does a failed job enter the dead-letter queue?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Chat server<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What happens when one client stops reading?<\/li>\n\n\n\n<li>Can that client hold up everyone else?<\/li>\n\n\n\n<li>Who owns the client registry?<\/li>\n\n\n\n<li>What happens to connected clients during shutdown?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>Key-value store<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Why did you choose a sharded map or sync.Map?<\/li>\n\n\n\n<li>What did the benchmark show?<\/li>\n\n\n\n<li>How does TTL expiry happen?<\/li>\n\n\n\n<li>What happens when the process restarts?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>gRPC services<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>What happens when the caller's deadline expires?<\/li>\n\n\n\n<li>Does the downstream request stop as well?<\/li>\n\n\n\n<li>How do you return the downstream failure?<\/li>\n\n\n\n<li>What happens when the inventory service is unavailable?<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">All these questions together might look scary at first, but the best way to deal with them is to treat them as a testing checklist. So, you don\u2019t have to prepare individual answers; you'll just check them and know!<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So don\u2019t shy away from doing this: Increase the worker count. Kill a worker. Stop Redis. Connect a client that doesn't read. Let a request hit its deadline. Run the benchmark again.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Then put the interesting results in the README.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you\u2019re also working on the wider structure of your portfolio, see <a href=\"https:\/\/www.scaler.com\/blog\/full-stack-projects-to-upskill-build-a-job-ready-resume\/\"><strong>how other engineers structure a job-ready project portfolio<\/strong><\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"conclusion\"><\/span><strong>Conclusion<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Go gives you plenty of room to build interesting backend systems. Start with golang projects that make you work with concurrency, then take it further: handle failures, control how work is scheduled, shut the service down properly, test the race-prone parts, and make the whole thing runnable outside your laptop. You don't need to build all twelve projects to learn this. Pick one Tier 2 project this week, take it through the production-ready checklist, and then decide what you want to build next.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to develop these backend skills through hands-on projects with mentorship, you can explore <a href=\"https:\/\/www.scaler.com\/academy\/\"><strong>Scaler Academy<\/strong><\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><span class=\"ez-toc-section\" id=\"faq\"><\/span><strong>FAQ<\/strong><span class=\"ez-toc-section-end\"><\/span><\/h2>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>1. What projects should I build to learn Golang?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with a CLI tool or REST API to get comfortable with Go's standard library and tooling. Then move to a project where concurrency is part of the problem, such as a worker-pool web scraper, rate limiter, or job queue. This gives you experience with the parts of Go that don't come up as much in a typical CRUD API.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>2. Is Golang good for beginners?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Go has a small syntax, relatively few language features, and strong tooling built into the language ecosystem. You can start using it without learning a large framework first. Though you might need more practice with concurrency, particularly once you start working with cancellation, shared state, and goroutine lifecycles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>3. What is Go actually used for?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Go is widely used for network services, APIs, command-line tools, infrastructure software, and systems where a compiled binary and predictable resource usage are useful. Docker, Kubernetes, Terraform, and Prometheus are examples of major infrastructure projects written in Go. Go is not commonly used for areas such as data science, machine learning, or frontend development.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>4. How long does a Golang project take to build?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">It depends on the project and how much time you can give it. A beginner CLI or API might take 1-2 weeks, while a concurrency-heavy project can take 2-3 weeks. A systems project such as a key-value store or gRPC service pair can take 3-5 weeks. These estimates assume roughly 8\u201310 focused hours per week.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>5. Are Golang projects enough to get a job in India?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Projects are a great addition, but you do require other aspects. You need solid backend fundamentals and the ability to explain the code you have written. Go has a smaller job market in India than languages such as Java and Python, and many Go openings are aimed at developers who already have backend experience. Building your backend fundamentals first and then specialising in Go can give you a more realistic path into Go roles.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>6. What should a Golang project include to look professional?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For the projects in this guide, start with wrapped errors, context propagation, graceful shutdown, structured logging with log\/slog, externalised configuration, table-driven tests, and go test -race for concurrent code. Add a multi-stage Dockerfile, CI, and a README that explains how the project works, how to run it, and the important design decisions you made.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>7. How should I structure a Go project?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">For a small portfolio project, you can keep the structure simple. Put executable entry points under cmd\/&lt;name&gt;\/main.go, application-specific private packages under internal\/, and keep main focused on wiring the application together. You don't need to reproduce a large community project layout for a small Go project.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><strong>8. Should I use Gin, Chi, Fiber, or the standard library?<\/strong><\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Start with Go's net\/http package. It gives you enough to build a lot of HTTP services and lets you understand how Go's HTTP stack works before adding another framework. Once you're comfortable with it, you can look at <strong>Chi<\/strong> for lightweight routing and middleware or <strong>Gin<\/strong> if you want more built-in functionality. The important part is understanding what the framework is doing rather than using one to avoid learning the standard library.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Have you ever looked at a classmate\u2019s or colleague\u2019s GitHub and realised you\u2019re building almost the same golang projects? You\u2019d be surprised to know how often this happens. A URL shortener, a chat app, a to-do list are great ways to practice Go, but when several candidates have the same projects, the project name alone [&hellip;]<\/p>\n","protected":false},"author":241,"featured_media":14368,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[35,410],"tags":[593],"class_list":["post-14367","post","type-post","status-publish","format-standard","has-post-thumbnail","category-software-development","category-projects","tag-golang-projects"],"acf":[],"_links":{"self":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14367","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/users\/241"}],"replies":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/comments?post=14367"}],"version-history":[{"count":1,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14367\/revisions"}],"predecessor-version":[{"id":14369,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/posts\/14367\/revisions\/14369"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/media\/14368"}],"wp:attachment":[{"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/media?parent=14367"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/categories?post=14367"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.scaler.com\/blog\/wp-json\/wp\/v2\/tags?post=14367"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}