15 промтов для Go: микросервисы, API и CLI утилиты

Введение

Go (Golang) — один из самых популярных языков для создания микросервисов, REST/gRPC API и консольных утилит. Его простота, высокая производительность и богатая стандартная библиотека делают его выбором №1 для многих компаний. Однако написание однотипного кода — настройка сервера, middleware, конфигурация — отнимает время. Используя промпты для AI (ChatGPT, Claude и др.), вы можете генерировать заготовки за секунды. В этой подборке — 15 готовых промптов для типовых задач Go-разработчика: от каркаса микросервиса до CLI-утилиты с progress bar. Каждый промпт сопровождается пояснением и фрагментом результата.


1. Базовый HTTP-микросервис с логгированием

Промпт:

Создай Go-микросервис с HTTP сервером на порту 8080. Используй роутер chi. Реализуй два эндпоинта: GET /hello (возвращает {"message":"Hello, World!"}) и POST /data (принимает JSON, логирует его и возвращает {"status":"ok"}). Добавь middleware для логгирования всех запросов с методом, путём и временем обработки.

Пример результата:

package main

import (
    "encoding/json"
    "log"
    "net/http"
    "time"

    "github.com/go-chi/chi/v5"
    "github.com/go-chi/chi/v5/middleware"
)

func loggingMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        next.ServeHTTP(w, r)
        log.Printf("%s %s %v", r.Method, r.URL.Path, time.Since(start))
    })
}

func main() {
    r := chi.NewRouter()
    r.Use(loggingMiddleware)

    r.Get("/hello", func(w http.ResponseWriter, r *http.Request) {
        json.NewEncoder(w).Encode(map[string]string{"message": "Hello, World!"})
    })

    r.Post("/data", func(w http.ResponseWriter, r *http.Request) {
        var data map[string]interface{}
        json.NewDecoder(r.Body).Decode(&data)
        log.Printf("Received data: %v", data)
        json.NewEncoder(w).Encode(map[string]string{"status": "ok"})
    })

    log.Println("Server started on :8080")
    http.ListenAndServe(":8080", r)
}

Этот промпт даёт полный каркас микросервиса, который можно сразу запустить и расширять.


2. gRPC-сервер с Protobuf

Промпт:

Напиши gRPC сервер на Go. Определи protobuf-файл с сервисом Greeter, содержащим RPC SayHello (принимает HelloRequest с полем name, возвращает HelloReply с полем message). Сгенерируй Go-код и реализуй сервер, который отвечает "Hello, " + name. Добавь функцию запуска на порту 50051.

Пример результата:

syntax = "proto3";

service Greeter {
  rpc SayHello (HelloRequest) returns (HelloReply);
}

message HelloRequest {
  string name = 1;
}

message HelloReply {
  string message = 2;
}
import pb "path/to/proto"

type server struct {
    pb.UnimplementedGreeterServer
}

func (s *server) SayHello(ctx context.Context, req *pb.HelloRequest) (*pb.HelloReply, error) {
    return &pb.HelloReply{Message: "Hello, " + req.Name}, nil
}

func main() {
    lis, _ := net.Listen("tcp", ":50051")
    s := grpc.NewServer()
    pb.RegisterGreeterServer(s, &server{})
    s.Serve(lis)
}

Промпт подходит для быстрого старта gRPC-микросервиса с генерацией кода.


3. CLI-утилита с Cobra

Промпт:

Создай CLI-утилиту на Go с использованием библиотеки Cobra. Утилита называется todo и имеет две команды: add (добавляет задачу, флаг --title) и list (выводит все задачи). Храни задачи в JSON-файле tasks.json. Реализуй корневую команду с описанием.

Пример результата:

var rootCmd = &cobra.Command{
    Use:   "todo",
    Short: "A simple todo list manager",
}

var addCmd = &cobra.Command{
    Use:   "add",
    Short: "Add a new task",
    Run: func(cmd *cobra.Command, args []string) {
        title, _ := cmd.Flags().GetString("title")
        // добавить в tasks.json
    },
}

func init() {
    addCmd.Flags().StringP("title", "t", "", "Task title")
    rootCmd.AddCommand(addCmd)
    rootCmd.AddCommand(listCmd)
}

Этот промпт избавляет от ручного написания boilerplate для CLI.


4. Dockerfile для Go-приложения

Промпт:

Напиши многоступенчатый Dockerfile для Go-приложения. Первая стадия использует официальный образ golang:1.22 для сборки, вторая — scratch (или alpine) для запуска. Должен быть установлен флаг -ldflags="-s -w" для уменьшения размера бинарника. Финальный образ должен использовать порт 8080 и команду CMD ["./app"].

Пример результата:

FROM golang:1.22 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/main .

FROM alpine:latest
WORKDIR /root/
COPY --from=builder /app/main .
EXPOSE 8080
CMD ["./main"]

Готовый Dockerfile для любого Go-микросервиса.


5. Health check endpoint

Промпт:

Добавь в существующий HTTP сервер на Go эндпоинт GET /health для проверки состояния. Он должен возвращать JSON с полями status (строка), timestamp (ISO8601) и uptime (в секундах). Используй глобальную переменную startTime для подсчёта uptime.

Пример результата:

var startTime = time.Now()

func healthHandler(w http.ResponseWriter, r *http.Request) {
    json.NewEncoder(w).Encode(map[string]interface{}{
        "status":    "ok",
        "timestamp": time.Now().UTC().Format(time.RFC3339),
        "uptime":    int(time.Since(startTime).Seconds()),
    })
}

Критический эндпоинт для Kubernetes probes.


6. Middleware для авторизации JWT

Промпт:

Напиши middleware для Go HTTP сервера (совместимый с chi/gorilla), который проверяет JWT-токен из заголовка Authorization. Если токен валиден, извлеки user_id из claims и положи в контекст. Используй библиотеку github.com/golang-jwt/jwt/v5. Если токен отсутствует или невалиден — возвращай 401.

Пример результата:

func JWTAuthMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        tokenStr := r.Header.Get("Authorization")
        if tokenStr == "" {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        claims := &Claims{}
        token, err := jwt.ParseWithClaims(tokenStr, claims, func(t *jwt.Token) (interface{}, error) {
            return jwtKey, nil
        })
        if err != nil || !token.Valid {
            http.Error(w, "Unauthorized", http.StatusUnauthorized)
            return
        }
        ctx := context.WithValue(r.Context(), "user_id", claims.UserID)
        next.ServeHTTP(w, r.WithContext(ctx))
    })
}

Готовая проверка аутентификации для защищённых эндпоинтов.


7. Graceful shutdown для HTTP сервера

Промпт:

Реализуй graceful shutdown для Go HTTP сервера. Используй каналы os.Signal для обработки SIGINT и SIGTERM. При получении сигнала останови сервер через Shutdown(ctx) с таймаутом 10 секунд. Выводи логи на каждом этапе.

Пример результата:

func main() {
    srv := &http.Server{Addr: ":8080", Handler: r}

    go func() {
        if err := srv.ListenAndServe(); err != nil && err != http.ErrServerClosed {
            log.Fatalf("listen: %s\n", err)
        }
    }()

    quit := make(chan os.Signal, 1)
    signal.Notify(quit, syscall.SIGINT, syscall.SIGTERM)
    <-quit
    log.Println("Shutting down server...")

    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    defer cancel()
    if err := srv.Shutdown(ctx); err != nil {
        log.Fatal("Server forced to shutdown:", err)
    }
    log.Println("Server exited")
}

Обязательный паттерн для production-микросервисов.


8. Валидация входящих JSON-запросов

Промпт:

Создай Go-структуру CreateUserRequest с полями Email (string, обязательное, email-формат) и Age (int, опциональное, минимум 18). Используй библиотеку github.com/go-playground/validator/v10 для валидации. Напиши обработчик, который принимает POST /users, валидирует тело, и возвращает 400 с ошибкой, если невалидно.

Пример результата:

type CreateUserRequest struct {
    Email string `json:"email" validate:"required,email"`
    Age   *int   `json:"age" validate:"omitempty,min=18"`
}

var validate = validator.New()

func createUserHandler(w http.ResponseWriter, r *http.Request) {
    var req CreateUserRequest
    json.NewDecoder(r.Body).Decode(&req)
    if err := validate.Struct(req); err != nil {
        w.WriteHeader(http.StatusBadRequest)
        json.NewEncoder(w).Encode(map[string]string{"error": err.Error()})
        return
    }
    // далее создание пользователя
}

Чистая валидация без ручных проверок.


9. CLI-утилита с progress bar

Промпт:

Напиши Go-утилиту, которая копирует файл из source в destination и показывает прогресс в виде ASCII progress bar. Используй библиотеку github.com/cheggaaa/pb/v3. Bar должен обновляться после каждой прочитанной порции (32 KB). Выводи скорость и оставшееся время.

Пример результата:

import (
    "io"
    "os"
    "github.com/cheggaaa/pb/v3"
)

func copyFile(src, dst string) error {
    source, _ := os.Open(src)
    defer source.Close()
    stat, _ := source.Stat()
    dest, _ := os.Create(dst)
    defer dest.Close()

    bar := pb.Full.Start64(stat.Size())
    barReader := bar.NewProxyReader(source)
    io.Copy(dest, barReader)
    bar.Finish()
    return nil
}

Полезно для любых файловых операций в CLI.


10. Swagger/OpenAPI документация

Промпт:

Добавь Swagger-документацию к Go HTTP серверу с помощью github.com/swaggo/swag. Напиши аннотации для эндпоинта POST /users — описание, принимаемая модель, код ответа 201 и 400. Сгенерируйте spec и настройте эндпоинт GET /swagger/* для отображения UI.

Пример результата:

// @Summary Create a new user
// @Accept json
// @Produce json
// @Param user body CreateUserRequest true "User data"
// @Success 201 {object} User
// @Failure 400 {object} ErrorResponse
// @Router /users [post]
func createUserHandler(w http.ResponseWriter, r *http.Request) { ... }

Автоматическая генерация документации из кода.


11. Работа с конфигурацией через Viper

Промпт:

Создай Go-приложение, которое читает конфигурацию из файла config.yaml и переменных окружения с помощью github.com/spf13/viper. Конфиг содержит: server.port, database.host, database.port. Установи значения по умолчанию. Выведи итоговую конфигурацию в лог.

Пример результата:

viper.SetConfigName("config")
viper.SetConfigType("yaml")
viper.AddConfigPath(".")
viper.AutomaticEnv()

viper.SetDefault("server.port", "8080")

if err := viper.ReadInConfig(); err != nil {
    log.Fatalf("Error reading config: %s", err)
}

port := viper.GetString("server.port")
dbHost := viper.GetString("database.host")
log.Printf("Starting server on :%s, DB at %s", port, dbHost)

Гибкое управление конфигурацией для любого сервиса.


12. Rate limiter middleware

Промпт:

Реализуй middleware для ограничения частоты запросов (rate limiter) на основе IP-адреса. Используй алгоритм sliding window с помощью библиотеки golang.org/x/time/rate. Лимит: 100 запросов в минуту. При превышении возвращай 429 Too Many Requests с заголовком Retry-After.

Пример результата:

var visitors = make(map[string]*rate.Limiter)
var mu sync.Mutex

func getLimiter(ip string) *rate.Limiter {
    mu.Lock()
    defer mu.Unlock()
    limiter, exists := visitors[ip]
    if !exists {
        limiter = rate.NewLimiter(rate.Every(time.Minute/100), 100)
        visitors[ip] = limiter
    }
    return limiter
}

func rateLimitMiddleware(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        limiter := getLimiter(r.RemoteAddr)
        if !limiter.Allow() {
            w.Header().Set("Retry-After", "1")
            http.Error(w, "Too Many Requests", http.StatusTooManyRequests)
            return
        }
        next.ServeHTTP(w, r)
    })
}

Защита от брутфорса и DDoS.


13. JSON API с пагинацией

Промпт:

Создай эндпоинт GET /items с пагинацией. Параметры: page (по умолчанию 1), per_page (по умолчанию 20, максимум 100). Ответ должен содержать массив items, total (общее количество), page, per_page. Используй слайс захардкоженных элементов. Реализуй middleware для CORS.

Пример результата:

func getItemsHandler(w http.ResponseWriter, r *http.Request) {
    page, _ := strconv.Atoi(r.URL.Query().Get("page"))
    perPage, _ := strconv.Atoi(r.URL.Query().Get("per_page"))
    if page < 1 { page = 1 }
    if perPage < 1 || perPage > 100 { perPage = 20 }

    var allItems []Item
    // загрузить из БД или заглушки

    start := (page - 1) * perPage
    if start >= len(allItems) {
        json.NewEncoder(w).Encode(map[string]interface{}{"items": []Item{}, "total": len(allItems), "page": page, "per_page": perPage})
        return
    }
    end := start + perPage
    if end > len(allItems) { end = len(allItems) }

    json.NewEncoder(w).Encode(map[string]interface{}{
        "items":    allItems[start:end],
        "total":    len(allItems),
        "page":     page,
        "per_page": perPage,
    })
}

Стандартный паттерн для REST API.


14. Интерактивный CLI с Survey

Промпт:

Создай Go-утилиту с интерактивным интерфейсом, используя библиотеку github.com/AlecAivazis/survey/v2. Запроси у пользователя имя, выбор цвета из списка (красный, зелёный, синий) и подтверждение (yes/no). Выведи результат в JSON.

Пример результата:

import "github.com/AlecAivazis/survey/v2"

func main() {
    var name string
    var color string
    var confirm bool

    survey.AskOne(&survey.Input{Message: "What is your name?"}, &name)
    survey.AskOne(&survey.Select{Message: "Choose a color:", Options: []string{"red", "green", "blue"}}, &color)
    survey.AskOne(&survey.Confirm{Message: "Continue?"}, &confirm)

    result := map[string]interface{}{"name": name, "color": color, "confirm": confirm}
    b, _ := json.Marshal(result)
    fmt.Println(string(b))
}

Отлично для быстрых интерактивных скриптов.


15. Тесты для HTTP обработчиков

Промпт:

Напиши unit-тесты для HTTP обработчика GET /hello на Go. Используй стандартную библиотеку testing и httptest. Проверь код ответа 200 и тело сообщения. Также напиши тест для случая с middleware, который проверяет, что middleware логирует запрос.

Пример результата:

func TestHelloHandler(t *testing.T) {
    req := httptest.NewRequest("GET", "/hello", nil)
    w := httptest.NewRecorder()
    helloHandler(w, req)

    resp := w.Result()
    if resp.StatusCode != http.StatusOK {
        t.Errorf("expected 200, got %d", resp.StatusCode)
    }
    var body map[string]string
    json.NewDecoder(resp.Body).Decode(&body)
    if body["message"] != "Hello, World!" {
        t.Errorf("unexpected message: %s", body["message"])
    }
}

Гарантия корректной работы API.


16. GraphQL сервер на gqlgen

Промпт:

Создай GraphQL сервер на Go с помощью github.com/99designs/gqlgen. Определи схему с типами User (id, name) и Query { users: [User!]! }. Реализуй резолвер, который возвращает список пользователей из захардкоженного слайса. Настрой эндпоинт /graphql и playground по /playground.

Пример результата:

schema {
  query: Query
}

type User {
  id: ID!
  name: String!
}

type Query {
  users: [User!]!
}
func (r *queryResolver) Users(ctx context.Context) ([]*model.User, error) {
    return []*model.User{
        {ID: "1", Name: "Alice"},
        {ID: "2", Name: "Bob"},
    }, nil
}

Быстрый старт GraphQL-микросервиса.


17. Работа с Redis как кеш

Промпт:

Реализуй Go-модуль для кеширования данных в Redis. Используй библиотеку github.com/redis/go-redis/v9. Напиши функции SetCache(key, value string, ttl time.Duration) и GetCache(key string) (string, bool). Добавь fallback: если Redis недоступен, функция должна возвращать ошибку, но не паниковать.

Пример результата:

var rdb *redis.Client

func initRedis() {
    rdb = redis.NewClient(&redis.Options{
        Addr:     "localhost:6379",
        Password: "",
        DB:       0,
    })
}

func SetCache(ctx context.Context, key, value string, ttl time.Duration) error {
    return rdb.Set(ctx, key, value, ttl).Err()
}

func GetCache(ctx context.Context, key string) (string, error) {
    val, err := rdb.Get(ctx, key).Result()
    if err == redis.Nil {
        return "", nil
    }
    return val, err
}

Лёгкое добавление кеширования в любой сервис.


18. CLI-утилита для парсинга CSV

Пrompt:

Создай Go-утилиту, которая читает CSV-файл, переданный как аргумент, и выводит в stdout количество строк и список уникальных значений из первого столбца. Используй стандартный пакет encoding/csv. Обработай ошибки отсутствия файла.

Пример результата:

func main() {
    if len(os.Args) < 2 {
        fmt.Println("Usage: csvparser <file.csv>")
        os.Exit(1)
    }

    f, err := os.Open(os.Args[1])
    if err != nil {
        log.Fatal(err)
    }
    defer f.Close()

    reader := csv.NewReader(f)
    records, _ := reader.ReadAll()
    fmt.Printf("Total rows: %d\n", len(records))

    set := make(map[string]bool)
    for _, rec := range records {
        if len(rec) > 0 {
            set[rec[0]] = true
        }
    }
    fmt.Println("Unique first column values:")
    for v := range set {
        fmt.Println(v)
    }
}

Простая утилита для быстрой обработки CSV.


Заключение

Эти 18 промптов покрывают 80% повседневных задач Go-разработчика: от каркаса микросервиса до CLI-утилит. Скопируйте нужный промпт, отправьте его ChatGPT или другой LLM — и получите готовый код, который останется только интегрировать в проект. Помните, что сгенерированный код требует проверки: нейросеть может ошибаться в деталях (импорты, версии библиотек). Адаптируйте примеры под свои нужды и используйте как стартовую точку. Попробуйте прямо сейчас — начните со своего первого микросервиса на Go!

← Все статьи

Комментарии

Читайте также

Как разработчики добавляли gapless playback: технический разбор и практические решения

27 июля 2026

Поступление в Cambridge Engineering: разбор курса Cambridge Admissions: ENGAA (Engineering Admissions Assessment)

27 июля 2026

12 промтов для генерации Python-кода: от скриптов до FastAPI

27 июля 2026

OSINT — разведка по открытым источникам: как собрать досье на компанию за час с помощью Asibiont и Python

27 июля 2026

Elasticsearch + AI-агент: автоматизация поиска, аналитики и прогнозирования трендов без единой строчки кода

27 июля 2026

Криптовалюты и блокчейн: регулирование (SEC, FINMA, ESMA, FCA) — как не попасть под штрафы и построить карьеру в комплаенс

27 июля 2026

12 промтов для работы с LLM: Fine-tuning, RAG и промпт-инжиниринг

27 июля 2026

NVIDIA использует процессор Vera для ускорения проектирования чипов нового поколения: революция в EDA

27 июля 2026

Scriptc от Vercel: TypeScript без рантайма — как нативный компилятор меняет serverless

27 июля 2026