Почему 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)
}