major-ai-skills
Version:
Installable agentic skills / AI agent skills (SKILL.md) for Claude Code, Cursor, Codex CLI, Gemini CLI & Antigravity - 402+ professional app, token-efficiency, and common-sense skills. SEO/GEO ready.
123 lines (98 loc) • 3.74 kB
Markdown
---
name: go-services
description: "Build Go HTTP services with contextual cancellation, middleware, tests, and compact deployable binaries."
category: development
risk: safe
source: self
source_type: self
date_added: "2026-08-26"
tags: ["go", "golang", "http", "modules", "services", "claude"]
tools: ["claude", "cursor", "gemini", "codex"]
---
# Go HTTP Services AI Skill Guide
## Overview & Engine Architecture
Go services are typically single static binaries with `net/http` (or a thin router), goroutines for concurrency, and `context.Context` for deadlines and cancellation. Agents keep packages small, return errors explicitly (no panic for control flow), propagate context into DB/HTTP clients, and use `go test` table-driven tests as the default quality gate.
```
main -> http.Server
|
mux / chi / echo
|
handlers -> services -> stores
|
context cancel / timeout
```
## When to use this skill
- Building REST/JSON backends in Go
- Structuring modules (`go.mod`) and internal packages
- Fixing leaked goroutines or ignored contexts
- Hardening graceful shutdown
## Operational directives
1. Accept `context.Context` as the first parameter on I/O methods.
2. Wrap errors with `%w` and handle at the edge with stable HTTP status mapping.
3. Prefer stdlib `net/http` + small router unless the team already standardized.
4. Run `go vet` and race detector on critical packages (`go test -race`).
5. Set read/write/idle timeouts on `http.Server` - never listen with zero timeouts in prod.
## Handler sketch
```go
package main
import (
"encoding/json"
"net/http"
"time"
)
type ItemIn struct {
SKU string `json:"sku"`
Qty int `json:"qty"`
}
func createItem(w http.ResponseWriter, r *http.Request) {
var in ItemIn
if err := json.NewDecoder(http.MaxBytesReader(w, r.Body, 1<<20)).Decode(&in); err != nil {
http.Error(w, "bad json", http.StatusBadRequest)
return
}
if in.SKU == "" || in.Qty < 0 {
http.Error(w, "invalid item", http.StatusBadRequest)
return
}
w.Header().Set("content-type", "application/json")
w.WriteHeader(http.StatusCreated)
_ = json.NewEncoder(w).Encode(map[string]any{"id": 1, "sku": in.SKU, "qty": in.Qty})
}
func main() {
mux := http.NewServeMux()
mux.HandleFunc("POST /items", createItem)
srv := &http.Server{
Addr: ":8080",
Handler: mux,
ReadHeaderTimeout: 5 * time.Second,
}
_ = srv.ListenAndServe()
}
```
## Commands
```bash
go mod init example.com/service
go test ./...
go test -race ./...
go build -o bin/service ./cmd/service
```
## Common pitfalls
| Pitfall | Why it hurts | Fix |
| --- | --- | --- |
| Ignoring `ctx.Done()` | Work continues after client leave | Select on ctx / pass down |
| Naked `go func()` without recovery | Process crash | Supervised workers |
| Global mutable clients | Flaky tests | Inject dependencies |
| No server timeouts | Slowloris risk | Set timeouts |
## Best practices
- Put binaries under `cmd/<name>` and libraries under `internal/`.
- Use structured logging (`slog`) with request IDs.
- Migrate SQL with a real tool (golang-migrate, goose) - not ad-hoc scripts only.
- Prefer interfaces at boundaries you need to mock; do not interface everything.
## Limitations
- Generics help but heavy abstraction can fight Go readability.
- cgo and certain crypto/OS deps complicate static builds.
- Framework choice (Gin, Echo, Fiber) should follow team norms.
## Related skills
- `@docker` - multi-stage Go builds
- `@postgresql` - typical datastore
- `@graphql-apis` - GraphQL servers in Go ecosystems