A skill your agent uses when writing or debugging non-trivial Go — error handling patterns, goroutine/channel design, interface composition, generics, context propagation, or Go-specific idioms like…

MITAuto-check passedDevelopment

Install Go

skills CLI
$ npx skills add kid-sid/claude-spellbook --skill go -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install kid-sid/claude-spellbook go --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/kid-sid/claude-spellbook.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/go .claude/skills/go && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
go
GitHub stars
189
Token cost
~4.3k tokens
SKILL.md length
586 words
Files
1
Skills in repo
52
Repo updated
First seen
Licence
MIT

At a glance

A skill your agent uses when writing or debugging non-trivial Go — error handling patterns, goroutine/channel design, interface composition, generics, context propagation, or Go-specific idioms like…

  • Debugging non-trivial Go — error handling patterns
  • SKILL.md covers When to Activate, Error Handling, Goroutines and Channels and Context, plus 10 more sections
  • Calls go
  • Goroutine/channel design

What it does

Go is an agent skill from kid-sid/claude-spellbook. Use when writing or debugging non-trivial Go — error handling patterns, goroutine/channel design, interface composition, generics, context propagation, or Go-specific idioms like table-driven tests and functional options.

Its SKILL.md is about 4.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Development, covering Async programming. The repository describes itself as: A curated collection of skills, prompts, and workflows that extend Claude's capabilities — your personal grimoire for AI-powered development. The licence is MIT.

When your agent uses it

  • Debugging non-trivial Go — error handling patterns
  • Goroutine/channel design
  • Interface composition
  • Context propagation

Example prompts

  • “/go”

What it can do on your machine

Read from SKILL.md and the folder at commit a7c2ac9. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • go

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Go loads about 4.3k tokens when it runs. Until then it costs about 56 tokens; SKILL.md has 586 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~56
When it runs · the whole SKILL.md, loaded when a task matches
~4.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from kid-sid/claude-spellbook at commit a7c2ac9, republished under its MIT licence (© kid-sid). 586 words, ~4,342 tokens.

Download SKILL.mdSave it as .claude/skills/go/SKILL.md (or your agent's skills folder).
name
go
description
Use when writing or debugging non-trivial Go — error handling patterns, goroutine/channel design, interface composition, generics, context propagation, or Go-specific idioms like table-driven tests and functional options.

Go — Advanced Patterns

Language-level patterns for writing correct, idiomatic, performant Go.

When to Activate

  • Designing error types, wrapping, and sentinel errors
  • Structuring goroutines, channels, and sync primitives correctly
  • Propagating context.Context for cancellation and deadlines
  • Composing interfaces and embedding types
  • Using generics (any, constraints, type parameters) appropriately
  • Writing table-driven tests, benchmarks, or fuzz targets
  • Applying functional options, builder patterns, or the options struct pattern
  • Structuring packages, modules, and internal vs exported APIs

Error Handling

Wrapping and unwrapping
go
import "errors"

// Wrap to add context — preserves the original for errors.Is/As
if err != nil {
    return fmt.Errorf("fetch user %d: %w", id, err)
}

// Sentinel errors — compare with errors.Is (not ==)
var ErrNotFound = errors.New("not found")
var ErrUnauthorized = errors.New("unauthorized")

if errors.Is(err, ErrNotFound) {
    // handle not found
}

// Custom error type — use errors.As to extract
type ValidationError struct {
    Field   string
    Message string
}
func (e *ValidationError) Error() string {
    return fmt.Sprintf("validation error on %s: %s", e.Field, e.Message)
}

var ve *ValidationError
if errors.As(err, &ve) {
    log.Printf("invalid field: %s", ve.Field)
}
Multiple return errors
go
// BAD: ignoring errors
data, _ := os.ReadFile("config.json")

// GOOD: always handle
data, err := os.ReadFile("config.json")
if err != nil {
    return fmt.Errorf("read config: %w", err)
}

// Return early, keep the happy path unindented
func process(id string) (*Result, error) {
    user, err := db.GetUser(id)
    if err != nil {
        return nil, fmt.Errorf("get user: %w", err)
    }
    orders, err := db.GetOrders(id)
    if err != nil {
        return nil, fmt.Errorf("get orders: %w", err)
    }
    return &Result{User: user, Orders: orders}, nil
}

Goroutines and Channels

Goroutine lifecycle — always have an exit strategy
go
// BAD: goroutine leaks — no way to stop it
go func() {
    for {
        process()
    }
}()

// GOOD: context-driven shutdown
func worker(ctx context.Context, jobs <-chan Job) {
    for {
        select {
        case <-ctx.Done():
            return
        case job, ok := <-jobs:
            if !ok {
                return  // channel closed
            }
            process(job)
        }
    }
}
Fan-out / fan-in
go
func fanOut(ctx context.Context, in <-chan int, workers int) <-chan Result {
    out := make(chan Result)
    var wg sync.WaitGroup

    for i := 0; i < workers; i++ {
        wg.Add(1)
        go func() {
            defer wg.Done()
            for v := range in {
                select {
                case out <- compute(v):
                case <-ctx.Done():
                    return
                }
            }
        }()
    }

    go func() {
        wg.Wait()
        close(out)  // signal downstream that all workers are done
    }()
    return out
}
Channel patterns
go
// Done channel — broadcast shutdown to many goroutines
done := make(chan struct{})
close(done)             // unblocks ALL receivers simultaneously

// Buffered channel as semaphore — limit concurrency
sem := make(chan struct{}, 10)
sem <- struct{}{}       // acquire
defer func() { <-sem }() // release

// Pipeline stage
func generate(nums ...int) <-chan int {
    out := make(chan int)
    go func() {
        defer close(out)
        for _, n := range nums {
            out <- n
        }
    }()
    return out
}

// Select with default — non-blocking send/receive
select {
case ch <- value:
    // sent
default:
    // channel full — drop or handle
}
sync primitives
go
// Mutex — protect shared state
type SafeCounter struct {
    mu    sync.Mutex
    count map[string]int
}
func (c *SafeCounter) Inc(key string) {
    c.mu.Lock()
    defer c.mu.Unlock()
    c.count[key]++
}

// RWMutex — concurrent reads, exclusive writes
type Cache struct {
    mu    sync.RWMutex
    store map[string]string
}
func (c *Cache) Get(k string) (string, bool) {
    c.mu.RLock()
    defer c.mu.RUnlock()
    v, ok := c.store[k]
    return v, ok
}

// sync.Once — initialize exactly once (safe for goroutines)
var instance *DB
var once sync.Once
func GetDB() *DB {
    once.Do(func() { instance = connect() })
    return instance
}

// sync.WaitGroup — wait for a collection of goroutines
var wg sync.WaitGroup
for _, item := range items {
    wg.Add(1)
    go func(i Item) {
        defer wg.Done()
        process(i)
    }(item)
}
wg.Wait()

Context

go
// Always accept context as the first parameter in public functions
func FetchUser(ctx context.Context, id string) (*User, error) { ... }

// Propagate — never store context in structs
type Service struct{ db *DB }  // GOOD — context passed per call
func (s *Service) Get(ctx context.Context, id string) (*User, error) { ... }

// Deadline / timeout
ctx, cancel := context.WithTimeout(ctx, 5*time.Second)
defer cancel()  // always defer cancel — releases resources even on success

// Cancellation
ctx, cancel := context.WithCancel(context.Background())
go worker(ctx)
cancel()  // signal worker to stop

// Value — only for request-scoped data (trace IDs, auth tokens), not config
type ctxKey string
const requestIDKey ctxKey = "requestID"

func WithRequestID(ctx context.Context, id string) context.Context {
    return context.WithValue(ctx, requestIDKey, id)
}
func RequestID(ctx context.Context) string {
    v, _ := ctx.Value(requestIDKey).(string)
    return v
}

// Check cancellation in long loops
for _, item := range largeSlice {
    if ctx.Err() != nil {
        return ctx.Err()
    }
    process(item)
}

Interfaces and Embedding

Interface design — small, composable
go
// BAD: fat interface — hard to implement, hard to test
type Storage interface {
    Get(id string) (*User, error)
    Save(u *User) error
    Delete(id string) error
    List(filter Filter) ([]*User, error)
    Search(q string) ([]*User, error)
    Count() (int, error)
}

// GOOD: small, focused interfaces
type UserGetter interface {
    GetUser(ctx context.Context, id string) (*User, error)
}
type UserSaver interface {
    SaveUser(ctx context.Context, u *User) error
}
// Compose only where needed
type UserStore interface {
    UserGetter
    UserSaver
}

// Accept interfaces, return structs
func NewService(store UserGetter) *Service { ... }  // testable
func NewPostgresStore(db *sql.DB) *PostgresStore { ... }  // concrete return
Embedding
go
// Struct embedding — promotes fields and methods
type Animal struct{ Name string }
func (a Animal) Speak() string { return a.Name }

type Dog struct {
    Animal              // promoted: dog.Name, dog.Speak()
    Breed string
}

// Interface embedding
type ReadWriter interface {
    io.Reader
    io.Writer
}

// Embedding to extend without inheriting
type LoggedStore struct {
    Store          // delegates all Store methods
    log *slog.Logger
}
func (ls *LoggedStore) GetUser(ctx context.Context, id string) (*User, error) {
    u, err := ls.Store.GetUser(ctx, id)  // delegate
    ls.log.Info("get user", "id", id, "err", err)
    return u, err
}

Functional Options Pattern

Preferred over long constructor signatures or config structs that need zero values to be meaningful.

go
type Server struct {
    host    string
    port    int
    timeout time.Duration
    logger  *slog.Logger
}

type Option func(*Server)

func WithPort(p int) Option        { return func(s *Server) { s.port = p } }
func WithTimeout(d time.Duration) Option { return func(s *Server) { s.timeout = d } }
func WithLogger(l *slog.Logger) Option   { return func(s *Server) { s.logger = l } }

func NewServer(host string, opts ...Option) *Server {
    s := &Server{host: host, port: 8080, timeout: 30 * time.Second}
    for _, opt := range opts {
        opt(s)
    }
    return s
}

// Usage
srv := NewServer("localhost",
    WithPort(9090),
    WithTimeout(10*time.Second),
    WithLogger(slog.Default()),
)

Generics

go
// Type constraint — built-in or custom
type Number interface {
    ~int | ~int32 | ~int64 | ~float32 | ~float64
}

func Sum[T Number](items []T) T {
    var total T
    for _, v := range items {
        total += v
    }
    return total
}

// Generic data structures
type Stack[T any] struct {
    items []T
}
func (s *Stack[T]) Push(v T) { s.items = append(s.items, v) }
func (s *Stack[T]) Pop() (T, bool) {
    var zero T
    if len(s.items) == 0 {
        return zero, false
    }
    v := s.items[len(s.items)-1]
    s.items = s.items[:len(s.items)-1]
    return v, true
}

// Map / Filter helpers
func Map[T, U any](slice []T, fn func(T) U) []U {
    result := make([]U, len(slice))
    for i, v := range slice {
        result[i] = fn(v)
    }
    return result
}

func Filter[T any](slice []T, fn func(T) bool) []T {
    var result []T
    for _, v := range slice {
        if fn(v) {
            result = append(result, v)
        }
    }
    return result
}

HTTP Patterns (net/http)

go
// Handler with dependencies — use a method, not a closure
type Handler struct {
    svc *UserService
    log *slog.Logger
}

func (h *Handler) GetUser(w http.ResponseWriter, r *http.Request) {
    id := r.PathValue("id")  // Go 1.22+ built-in path params
    user, err := h.svc.Get(r.Context(), id)
    if err != nil {
        if errors.Is(err, ErrNotFound) {
            http.Error(w, "not found", http.StatusNotFound)
            return
        }
        h.log.Error("get user", "err", err)
        http.Error(w, "internal error", http.StatusInternalServerError)
        return
    }
    w.Header().Set("Content-Type", "application/json")
    json.NewEncoder(w).Encode(user)
}

// Routing (Go 1.22+)
mux := http.NewServeMux()
mux.HandleFunc("GET /users/{id}", h.GetUser)
mux.HandleFunc("POST /users", h.CreateUser)

// Middleware chaining
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, "dur", time.Since(start))
    })
}

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

Testing

Table-driven tests
go
func TestAdd(t *testing.T) {
    cases := []struct {
        name string
        a, b int
        want int
    }{
        {"positive", 1, 2, 3},
        {"negative", -1, -2, -3},
        {"zero", 0, 0, 0},
    }
    for _, tc := range cases {
        t.Run(tc.name, func(t *testing.T) {
            got := Add(tc.a, tc.b)
            if got != tc.want {
                t.Errorf("Add(%d, %d) = %d, want %d", tc.a, tc.b, got, tc.want)
            }
        })
    }
}
Test helpers and cleanup
go
func setupDB(t *testing.T) *sql.DB {
    t.Helper()  // marks this as a helper — errors show caller's line
    db, err := sql.Open("sqlite3", ":memory:")
    if err != nil {
        t.Fatalf("open db: %v", err)
    }
    t.Cleanup(func() { db.Close() })  // runs after test, even on failure
    return db
}
Benchmarks and fuzz tests
go
func BenchmarkProcess(b *testing.B) {
    data := generateData()
    b.ResetTimer()  // exclude setup time
    for i := 0; i < b.N; i++ {
        Process(data)
    }
}

// Run: go test -bench=. -benchmem

func FuzzParse(f *testing.F) {
    f.Add("valid input")  // seed corpus
    f.Fuzz(func(t *testing.T, s string) {
        _, err := Parse(s)
        // must not panic — error is fine
        _ = err
    })
}
// Run: go test -fuzz=FuzzParse

Package and Module Conventions

PatternRule
Package namesShort, lowercase, no underscores: store, auth, httputil
Exported namesSelf-documenting without package prefix: store.User not store.StoreUser
internal/Enforces package privacy — only importable by parent module
cmd/One sub-package per binary entry point
Error variablesPrefix with Err: var ErrNotFound = errors.New(...)
Interface locationDefine interfaces in the consumer package, not the implementer
init()Avoid — prefer explicit initialization in main or constructors
myapp/
├── cmd/
│   └── server/main.go      # entry point
├── internal/
│   ├── auth/               # private to this module
│   └── store/
├── pkg/                    # reusable, importable by others
│   └── httputil/
└── go.mod

Common Gotchas

go
// Loop variable capture (Go < 1.22) — goroutine closes over the same variable
for _, v := range items {
    go func() { process(v) }()  // BAD pre-1.22: all goroutines see the final v
    go func(v Item) { process(v) }(v)  // GOOD: pass as argument
}
// Go 1.22+: each iteration gets its own copy automatically

// Nil interface != nil pointer
var p *MyType = nil
var i interface{} = p
i == nil  // false — interface has type info even if value is nil
// Return a plain nil to get a nil interface:
func getError() error { return nil }  // not return (*MyError)(nil)

// Slice append aliasing
a := []int{1, 2, 3}
b := a[:2]
b = append(b, 99)  // may overwrite a[2] if cap allows
// Use a[low:high:max] to control capacity and prevent aliasing:
b = a[:2:2]        // cap=2, so append always allocates a new backing array

// Map zero value is nil — must initialize before writing
var m map[string]int
m["x"] = 1  // panic: assignment to entry in nil map
m = make(map[string]int)
m["x"] = 1  // ok

// defer in a loop — deferred until function returns, not loop iteration
for _, f := range files {
    f, _ := os.Open(f)
    defer f.Close()  // BAD: all closes happen at function end
}
// GOOD: wrap in a closure or helper function
for _, name := range files {
    func() {
        f, _ := os.Open(name)
        defer f.Close()
        process(f)
    }()
}

Performance Tips

TechniqueWhen to use
Pre-allocate slicesmake([]T, 0, knownLen) — avoids repeated reallocation
Pre-allocate mapsmake(map[K]V, knownLen) — reduces rehashing
strings.BuilderBuilding strings in a loop — never += in a loop
sync.PoolReuse short-lived allocations (buffers, scratch objects)
Avoid interface{} in hot pathsBoxing/unboxing costs allocation; use generics or concrete types
//go:noescape / unsafeOnly after profiling with pprof
Benchmark firstgo test -bench=. -benchmem -cpuprofile=cpu.out

Show full SKILL.md (315 more words)Show less

Red Flags

  • Goroutine without a stop condition — every goroutine must have a way to exit (context cancellation, channel close, or done signal); goroutine leaks accumulate and crash servers under load
  • Storing context.Context in a struct — context is request-scoped and must be passed as the first function parameter; storing it bypasses cancellation and makes the struct un-testable
  • errors.New compared with == — sentinel errors must use errors.Is because wrapping breaks ==; define var ErrX = errors.New(...) and always check with errors.Is
  • Shadowing err with := in nested scope — if err := ...; err != nil inside a block creates a new err that shadows the outer one; outer error is silently unchanged
  • Nil pointer returned as non-nil interface — returning (*ConcreteType)(nil) as an error or interface{} produces a non-nil interface; always return untyped nil
  • defer inside a loop — deferred calls run at function return, not loop end; open file handles accumulate; wrap the loop body in a closure or helper function
  • Fat interfaces defined in the implementer package — interfaces belong in the consumer package; large interfaces make mocking painful and couple packages unnecessarily
  • Accessing a nil map — reading is safe (returns zero value), writing panics; always initialize maps with make

Checklist

  • Every error return is either handled or explicitly propagated with fmt.Errorf("...: %w", err)
  • Sentinel errors use errors.Is / errors.As, never ==
  • Every goroutine has a documented exit path (context, channel close, done signal)
  • context.Context is the first parameter of every function that does I/O or calls other services
  • cancel() from WithTimeout / WithCancel is deferred immediately after creation
  • Interfaces are defined in the consumer package and kept small (1-3 methods)
  • sync.WaitGroup.Add() is called before launching the goroutine, not inside it
  • Slices passed to goroutines are copied or ownership is clearly transferred
  • Maps are initialized with make before any write
  • Table-driven tests cover happy path, zero value, and at least one error case
  • Benchmarks use b.ResetTimer() after setup and b.ReportAllocs()
  • t.Helper() is called in every test helper function

© kid-sid, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in skills/go of kid-sid/claude-spellbook.

Open the folder on GitHubat commit a7c2ac9

Compare with similar skills

Go next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Go compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Go this skillkid-sid/claude-spellbook189—~4.3kAutomated safety check: PassMIT
YugabyteDB ASH Instrumentationyugabyte/yugabyte-db11k—~4.5kAutomated safety check: PassCustom licence
Mirage VFS Adapter Authoringstrukto-ai/mirage3.7k—~2.5kAutomated safety check: PassApache-2.0
Golang Patternsantoniopaya22/go-rest-template1729 repos~3.5kAutomated safety check: PassNone
Rust Async Patternsdiodeme/Gold-Band14310 repos~3.1kAutomated safety check: PassAGPL-3.0
Swift Concurrencyhenrypldev/react-native-nitro-mlx1003 repos~3.1kAutomated safety check: PassMIT

Similar skills

  • YugabyteDB ASH Instrumentation

    yugabyte/yugabyte-db

    Procedure for adding or changing YugabyteDB Active Session History wait states in TServer and DocDB C++ code, including the macro to use for sync and async paths.

    11k GitHub stars~4.5k tokensUpdated today
    DevelopmentAuto-check passed
  • Builds or extends a custom Mirage virtual filesystem adapter for an API, database, object store or app data, with a working mount configuration and filesystem tests.

    3.7k GitHub stars~2.5k tokensUpdated today
    DevelopmentAuto-check passed
  • Golang Patterns

    antoniopaya22/go-rest-template

    Idiomatic Go patterns, best practices, and conventions for building robust, efficient, and maintainable Go applications.

    172 GitHub starsUsed in 9 repos~3.5k tokens
    DevelopmentAuto-check passed
  • Rust Async Patterns

    diodeme/Gold-Band

    Master Rust async programming with Tokio, async traits, error handling, and concurrent patterns.

    143 GitHub starsUsed in 10 repos~3.1k tokens
    DevelopmentAuto-check passed
  • Swift Concurrency

    henrypldev/react-native-nitro-mlx

    Diagnose Swift Concurrency issues, refactor callback-based code to async/await, and guide Swift 6 migration when working with tasks, actors, @MainActor, Sendable, data races, thread safety, or…

    100 GitHub starsUsed in 3 repos~3.1k tokens
    DevelopmentAuto-check passed
  • Rust Engineer

    farm-fe/farm

    Writes, reviews, and debugs idiomatic Rust code with memory safety and zero-cost abstractions.

    5.6k GitHub starsUsed in 1 repo~1.5k tokens
    DevelopmentAuto-check passed

More from kid-sid/claude-spellbook

All 52 skills in this repo
  • Accessibility

    kid-sid/claude-spellbook

    A skill your agent uses when building or reviewing UI components for keyboard and screen reader compatibility, adding ARIA to custom widgets, auditing a page for WCAG AA conformance, or preparing…

    189 GitHub stars~3.2k tokensUpdated 2 mo ago
    Auto-check passed
  • Agentex

    kid-sid/claude-spellbook

    A skill your agent uses when building, wiring, or debugging an Agentex agent — choosing agent type, configuring acp.py and manifest.yaml, using adk.messages or adk.state, or resolving…

    189 GitHub stars~2.2k tokensUpdated 2 mo ago
    Auto-check: notes
  • AI Engineer

    kid-sid/claude-spellbook

    A skill your agent uses when building production LLM applications — designing RAG pipelines, choosing vector databases, implementing agent orchestration, optimizing cost, or adding AI safety…

    189 GitHub stars~3.7k tokensUpdated 2 mo ago
    Auto-check passed
  • Angular

    kid-sid/claude-spellbook

    A skill your agent uses when building or refactoring Angular applications — choosing between signals, RxJS, and NgRx for state, configuring routing with guards and lazy loading, optimizing change…

    189 GitHub stars~5k tokensUpdated 2 mo ago
    Auto-check passed
  • API Design

    kid-sid/claude-spellbook

    A skill your agent uses when designing new REST endpoints, reviewing an existing API contract, adding pagination or filtering, planning a versioning strategy, or building a public or partner-facing…

    189 GitHub stars~3.6k tokensUpdated 2 mo ago
    Auto-check passed
  • Auth

    kid-sid/claude-spellbook

    A skill your agent uses when implementing login flows, issuing or validating JWTs, setting up OAuth2/OIDC with a provider, designing role-based or attribute-based access control, securing API…

    189 GitHub stars~3.2k tokensUpdated 2 mo ago
    Auto-check passed

Categories

Questions about Go

What does Go do?

A skill your agent uses when writing or debugging non-trivial Go — error handling patterns, goroutine/channel design, interface composition, generics, context propagation, or Go-specific idioms like…. Go is an agent skill from kid-sid/claude-spellbook. Use when writing or debugging non-trivial Go — error handling patterns, goroutine/channel design, interface composition, generics, context propagation, or Go-specific idioms like table-driven tests and functional options.

When should I use Go?

Go fits situations like: debugging non-trivial Go — error handling patterns; goroutine/channel design; interface composition; context propagation.

How do I install Go in Claude Code?

Run `npx skills add kid-sid/claude-spellbook --skill go -a claude-code`. Or copy the skill folder (skills/go in kid-sid/claude-spellbook) into .claude/skills/go in your project. Claude Code loads it when a task matches its description.

How do I install Go in Codex?

Run `npx skills add kid-sid/claude-spellbook --skill go -a codex`. Or copy the skill folder (skills/go in kid-sid/claude-spellbook) into .agents/skills/go in your project. Codex loads it when a task matches its description.

Can I use Go in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add kid-sid/claude-spellbook --skill go -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/go, .gemini/skills/go, .github/skills/go and .opencode/skills/go in your project.

What does Go need to run?

Going by SKILL.md and its folder, Go needs the command-line tools its instructions call (go).

Does Go access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Go safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Go use?

Go is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Go use?

About 4.3k tokens (SKILL.md is roughly 17k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Go?

Skills that share tags, products or a category with Go: YugabyteDB ASH Instrumentation (yugabyte/yugabyte-db, 11k stars), Mirage VFS Adapter Authoring (strukto-ai/mirage, 3.7k stars), Golang Patterns (antoniopaya22/go-rest-template, 172 stars) and Rust Async Patterns (diodeme/Gold-Band, 143 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Go?

kid-sid (a GitHub user) maintains it in kid-sid/claude-spellbook, which has 189 GitHub stars. The repository holds 52 skills in this directory. The repository was last updated on August 5, 2026.

Source: kid-sid/claude-spellbook on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.