golang-cli
Golang CLI application development. Use when building, modifying, or reviewing a Go CLI tool โ especially for command structure,โฆ
Golang benchmarking, profiling, and performance measurement. Use when writing, running, or comparing Go benchmarks, profiling hot paths with pprof, interpreting CPU/memory/trace profiles, analyzing results with benchstat, setting up CI benchmark regression detection, or
Claude Code
$ npx -y skills add samber/cc-skills-golang --skill golang-benchmark --agent claude-code
Codex
$ npx skills add samber/cc-skills-golang --skill golang-benchmark -a codex -y
Cursor
$ npx skills add samber/cc-skills-golang --skill golang-benchmark -a cursor -y
Gemini CLI
$ npx skills add samber/cc-skills-golang --skill golang-benchmark -a gemini-cli -y
GitHub Copilot
$ npx skills add samber/cc-skills-golang --skill golang-benchmark -a github-copilot -y
OpenCode
$ npx skills add samber/cc-skills-golang --skill golang-benchmark -a opencode -y
Windsurf
$ npx skills add samber/cc-skills-golang --skill golang-benchmark -a windsurf -y
name: golang-benchmark
description: "Golang benchmarking, profiling, and performance measurement. Use when writing, running, or comparing Go benchmarks, profiling hot paths with pprof, interpreting CPU/memory/trace profiles, analyzing results with benchstat, setting up CI benchmark regression detection, or investigating production performance with Prometheus runtime metrics. Also use when the developer needs deep analysis on a specific performance indicator - this skill provides the measurement methodology, while `samber/cc-skills-golang@golang-performance` provides the optimization patterns."
user-invocable: true
license: MIT
compatibility: Designed for Claude Code, Codex or similar harness, and for projects using Golang.
metadata:
author: samber
version: "1.3.2"
openclaw:
emoji: "๐"
homepage: https://github.com/samber/cc-skills-golang
requires:
bins:
- go
- benchstat
install:
- kind: go
package: golang.org/x/perf/cmd/benchstat@latest
bins: [benchstat]
allowed-tools: Read Edit Write Glob Grep Bash(go:*) Bash(golangci-lint:*) Bash(git:*) Agent WebFetch Bash(benchstat:*) Bash(benchdiff:*) Bash(cob:*) Bash(gobenchdata:*) Bash(curl:*) mcp__context7__resolve-library-id mcp__context7__query-docs WebSearch AskUserQuestion EnterWorktree ExitWorktree
paths:
- "**/*.go"**Persona:** You are a Go performance measurement engineer. You never draw conclusions from a single benchmark run โ statistical rigor and controlled conditions are prerequisites before any optimization decision.
**Thinking mode:** Reason as thoroughly as possible for benchmark analysis, profile interpretation, and performance comparison tasks โ deep reasoning prevents misinterpreting profiling data and ensures statistically sound conclusions. On Claude Code, use `ultrathink` to trigger extended thinking explicitly.
**Dependencies:**
Performance improvement does not exist without measures โ if you can measure it, you can improve it.
This skill covers the full measurement workflow: write a benchmark, run it, profile the result, compare before/after with statistical rigor, and track regressions in CI. For optimization patterns to apply after measurement, โ See `samber/cc-skills-golang@golang-performance` skill. For pprof setup on running services, โ See `samber/cc-skills-golang@golang-troubleshooting` skill.
Benchmark functions live in a `_bench_test.go` file named after the source file under benchmark, not after the individual function โ `parser.go` -> `parser_bench_test.go`, containing `BenchmarkParse`, `BenchmarkEncode`, etc., not a separate `benchmarkparse_test.go` per function.
Order `Benchmark*` functions inside `parser_bench_test.go` to mirror the order of the functions/methods they measure in `parser.go` โ a reader comparing the two files top to bottom should find `BenchmarkParse` at the same relative position as `Parse`.
For Go 1.24+, prefer `b.Loop()` for new benchmarks. It times only the loop body and keeps function arguments/results alive, which reduces dead-code-elimination mistakes.
func BenchmarkParse(b *testing.B) {
data := loadFixture("large.json") // setup โ excluded from timing
for b.Loop() {
Parse(data) // compiler cannot eliminate this call
}
}Legacy `b.N` loops still compile and are fine to keep when preserving existing benchmarks or supporting Go <1.24. They are easier to get wrong: setup may need `b.ResetTimer()`, and results may need a sink if the compiler can eliminate the work. Go 1.26 fixed an earlier `b.Loop()` inlining limitation โ benchmarks on 1.24โ1.25 already benefit from `b.Loop()` but may miss inlining optimizations that 1.26 delivers.
Go 1.27's size-specialized allocator changes allocation-heavy benchmark baselines (faster sub-80-byte allocations, larger binaries) independent of any code change. Treat a `benchstat` comparison that straddles the Go 1.26โ1.27 toolchain boundary as measuring the toolchain, not the code โ rerun the "before" benchmark on the same toolchain as "after" before trusting the delta.
func BenchmarkAlloc(b *testing.B) {
b.ReportAllocs() // or run with -benchmem flag
var sink []byte
for b.Loop() {
sink = make([]byte, 1024)
}
_ = sink
}`b.ReportMetric()` adds custom metrics (e.g., throughput):
b.ReportMetric(float64(totalBytes)/b.Elapsed().Seconds(), "bytes/s") // b.Elapsed() is only valid inside b.Loop()
func BenchmarkEncode(b *testing.B) {
for _, size := range []int{64, 256, 4096} {
b.Run(fmt.Sprintf("size=%d", size), func(b *testing.B) {
data := make([]byte, size)
for b.Loop() {
Encode(data)
}
})
}
}go test -bench=BenchmarkEncode -benchmem -count=10 ./pkg/... | tee bench.txt
| Flag | Purpose | | ---------------------- | ----------------------------------------- | | `-bench=.` | Run all benchmarks (regexp filter) | | `-benchmem` | Report allocations (B/op, allocs/op) | | `-count=10` | Run 10 times for statistical significance | | `-benchtim
AI agent skills are reusable instruction sets that extend your coding assistant with domain-specific expertise, loaded on demand so they don't bloat your context. This repository covers Go-specific skills only (language, testing, security, observability, etc.)
Golang CLI application development. Use when building, modifying, or reviewing a Go CLI tool โ especially for command structure,โฆ
Golang code style conventions โ line length and breaking, variable declarations, control flow clarity, when comments help vsโฆ
Golang concurrency design โ goroutine lifecycle and leak prevention, channels and `select`, channel ownership and direction,โฆ
Idiomatic context.Context usage in Golang โ propagation through API boundaries, cancellation, timeouts and deadlines,โฆ
GitHub Actions CI/CD pipeline configuration for Golang projects โ workflow files for test, lint, SAST, coverage andโฆ
Golang data structures โ slices (internals, capacity growth, preallocation, slices package), maps (internals, hash buckets, mapsโฆ
You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, orโฆ
Ask which skill or flow fits your situation. A router over the skills in this repo.