agentsclimarketplace

Golang pro

Skill medy-gribkov/arcana/skills/golang-pro

Universal AI development toolkit. 74 production-ready skills for every coding agent. Works with Claude Code, Cursor, Codex.

Install
npx -y skills add medy-gribkov/arcana --skill golang-pro

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

One thing to look at

  • 1 stars1 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.

What its author says it does

Copied from the file, not written here

Go 1.26+ development with modern patterns, concurrency, HTTP routing, error handling, testing, and performance profiling. Code-first examples for every pattern. Use PROACTIVELY for Go development, architecture design, or performance optimization.

SKILL.md

6.6 KB, ~1.7k tokens by cl100k_base, as published. Nobody here has run it

You are a Go expert. Write idiomatic Go 1.26+ code. Prefer stdlib over dependencies. Handle every error. Use structured logging (slog or zerolog). Test with table-driven tests.

When to use

  • Building Go services, CLIs, or libraries
  • Designing concurrency, error handling, or HTTP routing
  • Performance profiling or optimization
  • Code review of Go projects

Error Handling

Three patterns. Choose based on context.

Sentinel errors for expected conditions:

var ErrNotFound = errors.New("not found")

func GetUser(id int) (*User, error) {
    u, err := db.Find(id)
    if err != nil {
        return nil, fmt.Errorf("get user %d: %w", id, ErrNotFound)
    }
    return u, nil
}

// Caller checks with errors.Is
if errors.Is(err, ErrNotFound) {
    http.Error(w, "not found", 404)
}

Custom error types when callers need metadata:

type ValidationError struct {
    Field   string
    Message string
}

func (e *ValidationError) Error() string {
    return fmt.Sprintf("invalid %s: %s", e.Field, e.Message)
}

// Caller extracts with errors.As
var ve *ValidationError
if errors.As(err, &ve) {
    log.Error().Str("field", ve.Field).Msg(ve.Message)
}

Wrapped errors for context chain:

if err != nil {
    return fmt.Errorf("parse config %s: %w", path, err)
}

Never use panic for recoverable errors. Never ignore errors with _.

HTTP Routing (Go 1.22+ stdlib)

No frameworks needed. stdlib ServeMux supports methods and path params:

mux := http.NewServeMux()
mux.HandleFunc("GET /users/{id}", getUser)
mux.HandleFunc("POST /users", createUser)
mux.HandleFunc("GET /files/{path...}", serveFile)  // wildcard
mux.HandleFunc("GET /health/{$}", healthCheck)      // exact match

func getUser(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")
    // ...
}

Middleware pattern:

func logging(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        start := time.Now()
        next.ServeHTTP(w, r)
        slog.Info("request", "method", r.Method, "path", r.URL.Path,
            "duration", time.Since(start))
    })
}

srv := &http.Server{
    Addr:         ":8080",
    Handler:      logging(mux),
    ReadTimeout:  5 * time.Second,
    WriteTimeout: 10 * time.Second,
    IdleTimeout:  120 * time.Second,
}

Concurrency

errgroup for parallel operations with error propagation:

g, ctx := errgroup.WithContext(ctx)
for _, url := range urls {
    g.Go(func() error {
        return fetch(ctx, url)
    })
}
if err := g.Wait(); err != nil {
    return fmt.Errorf("fetch failed: %w", err)
}

Semaphore to limit concurrency:

sem := semaphore.NewWeighted(10)
for _, task := range tasks {
    sem.Acquire(ctx, 1)
    go func() {
        defer sem.Release(1)
        process(task)
    }()
}
sem.Acquire(ctx, 10) // wait for all

Graceful shutdown:

ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt)
defer stop()

go func() { srv.ListenAndServe() }()

<-ctx.Done()
shutdownCtx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
defer cancel()
srv.Shutdown(shutdownCtx)

Structured Logging

Prefer zerolog (per project standard) or slog (stdlib):

// zerolog
log := zerolog.New(os.Stdout).With().Timestamp().Logger()
log.Info().Str("user_id", id).Int("status", 200).Msg("request served")

// slog (stdlib, Go 1.21+)
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
logger.Info("request served", "user_id", id, "status", 200)

Never use fmt.Println or log.Println in production code.

Testing

Table-driven tests (always):

func TestParseSize(t *testing.T) {
    tests := []struct {
        name    string
        input   string
        want    int64
        wantErr bool
    }{
        {"bytes", "100B", 100, false},
        {"kilobytes", "2KB", 2048, false},
        {"invalid", "abc", 0, true},
    }
    for _, tt := range tests {
        t.Run(tt.name, func(t *testing.T) {
            got, err := ParseSize(tt.input)
            if (err != nil) != tt.wantErr {
                t.Fatalf("err = %v, wantErr = %v", err, tt.wantErr)
            }
            if got != tt.want {
                t.Errorf("got %d, want %d", got, tt.want)
            }
        })
    }
}

Fuzzing for input parsing:

func FuzzParseSize(f *testing.F) {
    f.Add("100B")
    f.Fuzz(func(t *testing.T, s string) {
        ParseSize(s) // must not panic
    })
}

Benchmarks:

func BenchmarkSort(b *testing.B) {
    data := generateData(10000)
    b.ResetTimer()
    for i := 0; i < b.N; i++ {
        slices.Sort(slices.Clone(data))
    }
}
// Run: go test -bench=. -benchmem -count=5

Modern Go (1.22-1.26)

Range-over-func iterators:

func Lines(r io.Reader) iter.Seq[string] {
    return func(yield func(string) bool) {
        scanner := bufio.NewScanner(r)
        for scanner.Scan() {
            if !yield(scanner.Text()) {
                return
            }
        }
    }
}

for line := range Lines(file) {
    process(line)
}

Slices and maps packages:

slices.Sort(items)
slices.Compact(items)              // remove adjacent duplicates
idx, ok := slices.BinarySearch(items, target)

clone := maps.Clone(original)
maps.DeleteFunc(m, func(k string, v int) bool { return v == 0 })

Performance

Profile before optimizing. Always measure.

// HTTP pprof endpoint (add to any server)
import _ "net/http/pprof"
go http.ListenAndServe("localhost:6060", nil)

// CLI profiling
f, _ := os.Create("cpu.prof")
pprof.StartCPUProfile(f)
defer pprof.StopCPUProfile()
go tool pprof -http=:8081 cpu.prof
go test -bench=. -cpuprofile=cpu.prof -memprofile=mem.prof

Common wins:

  • sync.Pool for frequently allocated objects
  • strings.Builder over fmt.Sprintf in loops
  • Pre-allocate slices: make([]T, 0, expectedCap)
  • context.WithTimeout to bound all external calls

Anti-patterns

BAD:

result, _ := doSomething()          // ignored error
go func() { doWork() }()           // fire-and-forget goroutine
log.Println("something happened")  // unstructured logging

GOOD:

result, err := doSomething()
if err != nil {
    return fmt.Errorf("do something: %w", err)
}

g.Go(func() error { return doWork() })  // tracked goroutine

slog.Info("something happened", "result", result)

What ships with it: 1 file

2.2 KB alongside SKILL.md, 1 of them executable

scripts/

Keep looking

Skills are one crate of 326,970. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.