С нуля до джуна: 5 проектов на Go, которые взорвут ваше портфолио

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Почему Go — это ваш золотой билет в мир бэкенда

Если вы читаете это, то наверняка уже знаете, что Go (Golang) — это не просто очередной модный язык. Это язык, на котором пишут Docker, Kubernetes, Prometheus и половина инфраструктуры современного интернета. Но знаете, что отличает крутого разработчика от новичка? Не знание синтаксиса, а реальные проекты для портфолио на Go.

Работодатели устали от однотипных "туду-листов" на React. Им нужны люди, которые понимают горутины, умеют проектировать API и не боятся работы с сетью. В этой статье мы не просто перечислим идеи — мы разберем 5 проектов с реальными фрагментами кода, которые закроют 90% вопросов на собеседовании. Поехали!

Проект №1: RESTful API для сокращения ссылок (URL Shortener)

Почему это важно?

Это классика жанра. Любой бэкенд-разработчик должен уметь поднимать HTTP-сервер, работать с middleware и роутингом. Проект "сокращатель ссылок" идеально ложится на Golang проекты для портфолио, так как позволяет показать понимание структур, хеширования и работы с базами данных.

Что будем писать?

Мы создадим простой сервер на net/http (без сторонних библиотек, чтобы показать знание стандартной библиотеки). Сервер будет принимать длинный URL и возвращать короткий код (например, /abc123).

package main

import (
    "crypto/rand"
    "encoding/hex"
    "encoding/json"
    "fmt"
    "net/http"
    "sync"
)

type URLStore struct {
    mu   sync.RWMutex
    data map[string]string
}

var store = URLStore{data: make(map[string]string)}

func generateShortID() string {
    bytes := make([]byte, 4)
    rand.Read(bytes)
    return hex.EncodeToString(bytes)
}

func shortenHandler(w http.ResponseWriter, r *http.Request) {
    if r.Method != http.MethodPost {
        http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
        return
    }

    var req struct {
        URL string `json:"url"`
    }
    if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
        http.Error(w, "Bad request", http.StatusBadRequest)
        return
    }

    shortID := generateShortID()
    store.mu.Lock()
    store.data[shortID] = req.URL
    store.mu.Unlock()

    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(map[string]string{
        "short_url": fmt.Sprintf("http://localhost:8080/%s", shortID),
    })
}

func redirectHandler(w http.ResponseWriter, r *http.Request) {
    shortID := r.URL.Path[1:]
    store.mu.RLock()
    originalURL, ok := store.data[shortID]
    store.mu.RUnlock()

    if !ok {
        http.NotFound(w, r)
        return
    }
    http.Redirect(w, r, originalURL, http.StatusFound)
}

func main() {
    http.HandleFunc("/shorten", shortenHandler)
    http.HandleFunc("/", redirectHandler)
    fmt.Println("Server started at :8080")
    http.ListenAndServe(":8080", nil)
}

Что вы прокачаете?

  • Работу с sync.RWMutex для конкурентного доступа
  • JSON-сериализацию
  • Чистую архитектуру без фреймворков

Этот проект для портфолио на Go покажет, что вы понимаете, как работают вещи "под капотом".

Проект №2: CLI-утилита для мониторинга системы

Зачем это в портфолио?

Go славится своими консольными утилитами. Написать свой top или htop — отличный способ показать работу с системными вызовами и горутинами. Это один из самых полезных проектов для портфолио на Go, потому что он близок к реальным DevOps-задачам.

Код: Мониторинг CPU и памяти

package main

import (
    "fmt"
    "os"
    "os/exec"
    "strconv"
    "strings"
    "time"
)

func getCPUPercent() (float64, error) {
    out, err := exec.Command("sh", "-c", "top -bn1 | grep 'Cpu(s)' | awk '{print $2}'").Output()
    if err != nil {
        return 0, err
    }
    cpuStr := strings.TrimSpace(string(out))
    cpuStr = strings.TrimSuffix(cpuStr, "%")
    return strconv.ParseFloat(cpuStr, 64)
}

func getMemPercent() (float64, error) {
    out, err := exec.Command("sh", "-c", "free | grep Mem | awk '{print $3/$2 * 100.0}'").Output()
    if err != nil {
        return 0, err
    }
    memStr := strings.TrimSpace(string(out))
    return strconv.ParseFloat(memStr, 64)
}

func main() {
    for {
        cpu, _ := getCPUPercent()
        mem, _ := getMemPercent()
        fmt.Printf("\rCPU: %.1f%% | MEM: %.1f%%", cpu, mem)
        os.Stdout.Sync()
        time.Sleep(2 * time.Second)
    }
}

Что вы прокачаете?

  • Вызов shell-команд через os/exec
  • Форматирование вывода в реальном времени
  • Бесконечные циклы с контролем времени

Добавьте флаги (-interval, -json) — и ваш Golang проект станет выглядеть как профессиональный инструмент.

Проект №3: WebSocket чат с историей сообщений

Почему это сложно, но круто?

WebSocket — это must-have для любого современного разработчика. Чат на Go показывает, что вы умеете управлять состоянием подключений и работать с каналами. Это один из самых эффектных проектов на Golang для портфолио.

Базовая реализация

package main

import (
    "fmt"
    "net/http"
    "sync"
    "github.com/gorilla/websocket"
)

var upgrader = websocket.Upgrader{
    CheckOrigin: func(r *http.Request) bool { return true },
}

type ChatRoom struct {
    clients map[*websocket.Conn]bool
    mu      sync.Mutex
}

var room = ChatRoom{clients: make(map[*websocket.Conn]bool)}

func handleWS(w http.ResponseWriter, r *http.Request) {
    conn, _ := upgrader.Upgrade(w, r, nil)
    room.mu.Lock()
    room.clients[conn] = true
    room.mu.Unlock()

    defer func() {
        room.mu.Lock()
        delete(room.clients, conn)
        room.mu.Unlock()
        conn.Close()
    }()

    for {
        _, msg, err := conn.ReadMessage()
        if err != nil {
            break
        }
        room.mu.Lock()
        for client := range room.clients {
            client.WriteMessage(websocket.TextMessage, msg)
        }
        room.mu.Unlock()
    }
}

func main() {
    http.HandleFunc("/ws", handleWS)
    http.Handle("/", http.FileServer(http.Dir("./static")))
    fmt.Println("Chat server on :8080")
    http.ListenAndServe(":8080", nil)
}

                
                

Блоги

Рекомендаций по книгам