🤯 Почему Go идеально подходит для первого API?
Go — это язык, который будто создан для бекенда. Он быстрый, простой и не заставляет тебя устанавливать половину интернета ради одного сервера.
В других языках ты иногда только настраиваешь окружение дольше, чем живёт мотивация. А в Go всё проще: написал несколько строк, запустил — и у тебя уже работает сервер.
⚡ встроенный HTTP-сервер
🧱 понятная структура кода
🚀 быстрая компиляция
🧠 минимум магии, максимум контроля
🧩 Что мы сделаем?
Сегодня соберём маленький API, который умеет:
принимать HTTP-запросы;
отвечать обычным текстом;
возвращать JSON;
читать параметры из URL.
То есть не просто “Hello World”, а уже что-то похожее на настоящий маленький бекенд.
🛠 Шаг 1. Создаём файл main.go
Создай папку проекта и файл main.go. Внутрь вставь вот такой код:
package main
import (
"fmt"
"net/http"
)
func handler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Hello, API 👋")
}
func main() {
http.HandleFunc("/", handler)
http.ListenAndServe(":8080", nil)
}Запускаем:
go run main.goТеперь открой в браузере:
http://localhost:8080Если видишь Hello, API 👋 — поздравляю, сервер жив. Он дышит. Он принимает запросы. Он уже почти взрослый.
🧠 Что происходит в коде
Давай без занудства.
net/http— встроенный пакет Go для работы с HTTP;handler— функция, которая отвечает на запрос;w— объект, через который мы отправляем ответ;r— объект с информацией о запросе;http.ListenAndServe(":8080", nil)— запуск сервера на порту 8080.
По сути, мы сказали Go: “Слушай порт 8080 и отвечай всем, кто придёт”.
🔥 Шаг 2. Возвращаем JSON как нормальный API
Текст — это мило, но настоящий API обычно возвращает JSON. Поэтому прокачаем код.
package main
import (
"encoding/json"
"net/http"
)
type Response struct {
Message string `json:"message"`
Status string `json:"status"`
}
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
response := Response{
Message: "API работает 🚀",
Status: "ok",
}
json.NewEncoder(w).Encode(response)
}
func main() {
http.HandleFunc("/api", handler)
http.ListenAndServe(":8080", nil)
}Теперь открой:
http://localhost:8080/apiОтвет будет таким:
{
"message": "API работает 🚀",
"status": "ok"
}Всё. Это уже настоящий API. Не “ну типа сервер”, а нормальная ручка, которая возвращает JSON.

⚙️ Шаг 3. Добавляем параметр в запрос
Сейчас API всегда отвечает одинаково. Но обычно сервер должен реагировать на данные от пользователя. Например, передадим имя:
http://localhost:8080/api?name=AlexОбновим обработчик:
func handler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
name := r.URL.Query().Get("name")
if name == "" {
name = "гость"
}
response := map[string]string{
"message": "Привет, " + name,
}
json.NewEncoder(w).Encode(response)
}Теперь если открыть /api?name=Alex, сервер вернёт персональный ответ. Маленькая деталь, но ощущение уже такое, будто ты пишешь микросервис для стартапа с оценкой в миллиард.
🧱 Шаг 4. Добавляем несколько маршрутов
Один маршрут — хорошо. Несколько — уже похоже на приложение.
package main
import (
"encoding/json"
"net/http"
)
func helloHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{
"message": "Hello from Go 👋",
})
}
func userHandler(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]string{
"name": "Alex",
"role": "developer",
})
}
func main() {
http.HandleFunc("/hello", helloHandler)
http.HandleFunc("/user", userHandler)
http.ListenAndServe(":8080", nil)
}Теперь у нас есть два адреса:
/hello— приветствие;/user— данные пользователя.
И вот тут начинается кайф: ты уже можешь добавлять новые маршруты, новые данные и постепенно собирать полноценный API.
💣 Частые ошибки новичков
❌ Забыть Content-Type
Если возвращаешь JSON, лучше явно указать:
w.Header().Set("Content-Type", "application/json")❌ Сразу тащить фреймворк
Для первого API не нужен большой фреймворк. Сначала пойми базу: запрос, обработчик, ответ, JSON.
❌ Не проверять ошибки
В учебном примере можно жить проще, но в реальном проекте ошибки игнорировать нельзя. Go этого не любит. И жизнь тоже.
❌ Писать всё в одном файле навсегда
Для старта main.go — нормально. Но когда проект растёт, код лучше разделять: маршруты отдельно, логика отдельно, модели отдельно.
📱 Где тренироваться дальше
Читать статьи полезно, но программирование реально прокачивается только через практику. Можно посмотреть 20 гайдов по Go, но пока сам не напишешь сервер — мозг будет делать вид: “да-да, я всё понял”, хотя на самом деле просто красиво покивал.
В приложении Кодик можно учиться программированию через практические задания: короткие уроки, понятные объяснения и тренировка прямо на задачах.
А ещё у Кодика есть телеграм-сообщество, где выходят полезные посты, разборы и советы. Это удобный способ повторять программирование не только “когда сел учиться”, но и между делом.
🚀 Что делать дальше?
После первого API можно двигаться дальше:
подключить базу данных;
сделать CRUD;
добавить авторизацию;
разделить проект на папки;
попробовать роутер вроде
chiилиgorilla/mux.
Но главное — не пытаться сразу построить “идеальную архитектуру”. Сначала сделай так, чтобы работало. Потом сделай красиво. Потом снова сломай. Потом пойми, почему. Вот это и есть разработка.
