Введение
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, содержащим RPCSayHello(принимает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с полями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!
Комментарии