Claude Cursor Skill

cgo-bindings

cgo conventions for linking Go to a C or Rust static library: import "C" directives, type/string conversion, CString memory management, thread safety, and Go pointer pinning. Load when generating or reviewing cgo bindings that call a C or Rust core from Go.

LLM Mart · 0 points · 0 views 0 listing impressions 0 install-command copies
Virus-scanned Reviewed automatically before listing.

Full trust report

Download goldziher-ai-rulez-internal_builtins_bindings_cgo_skills_cgo-bindings-ca967ad.zip · 0 KB
Part of goldziher/ai-rulez — 151 skills

Install

skills CLI npx skills add https://github.com/Goldziher/ai-rulez/tree/main/internal/builtins/bindings/cgo/skills/cgo-bindings
Claude Code claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install goldziher-ai-rulez@llmmart
Git git clone https://github.com/Goldziher/ai-rulez.git

The skills CLI installs just this skill, for any of its supported agents. Claude Code installs the whole goldziher/ai-rulez collection as a plugin from our marketplace. Git is the plain clone.

Skill manifest

  • Use import "C" with // #cgo LDFLAGS: and // #cgo CFLAGS: directives for linking.
  • Declare C header functions in comment block immediately above import "C" — no blank line between.
  • Type mapping: C.int, C.long, C.char. Use C.CString() and C.GoString() for string conversion.
  • Memory: C.CString() allocates — always defer C.free(unsafe.Pointer(cStr)) immediately after creation.
  • Error handling: return error codes from C functions, convert to Go error values. Check all return values.
  • Link Rust static libraries: // #cgo LDFLAGS: -L./target/release -lmylib. Build Rust with crate-type = ["staticlib"].
  • Thread safety: C functions called from Go may run on any OS thread. Use runtime.LockOSThread() when needed.
  • Go pointer passing: use runtime.Pinner (Go 1.21+) to pin Go memory passed to C. Never pass Go pointers without pinning.
  • Test with go test (requires CGO_ENABLED=1). Mock C layer for unit tests, use integration tests for real FFI.
  • Build: CGO_ENABLED=1 go build. Cross-compilation requires appropriate C toolchain.
  • Anti-patterns: leaking C.CString memory, passing unpinned Go pointers to C, ignoring C return codes.
Files (ai-rulez)
  • SKILL.md 1.5 KB
    ---
    name: cgo-bindings
    description: "cgo conventions for linking Go to a C or Rust static library: import \"C\" directives, type/string conversion, CString memory management, thread safety, and Go pointer pinning. Load when generating or reviewing cgo bindings that call a C or Rust core from Go."
    ---
    
    - Use `import "C"` with `// #cgo LDFLAGS:` and `// #cgo CFLAGS:` directives for linking.
    - Declare C header functions in comment block immediately above `import "C"` — no blank line between.
    - Type mapping: `C.int`, `C.long`, `C.char`. Use `C.CString()` and `C.GoString()` for string conversion.
    - Memory: `C.CString()` allocates — always `defer C.free(unsafe.Pointer(cStr))` immediately after creation.
    - Error handling: return error codes from C functions, convert to Go `error` values. Check all return values.
    - Link Rust static libraries: `// #cgo LDFLAGS: -L./target/release -lmylib`. Build Rust with `crate-type = ["staticlib"]`.
    - Thread safety: C functions called from Go may run on any OS thread. Use `runtime.LockOSThread()` when needed.
    - Go pointer passing: use `runtime.Pinner` (Go 1.21+) to pin Go memory passed to C. Never pass Go pointers without pinning.
    - Test with `go test` (requires `CGO_ENABLED=1`). Mock C layer for unit tests, use integration tests for real FFI.
    - Build: `CGO_ENABLED=1 go build`. Cross-compilation requires appropriate C toolchain.
    - Anti-patterns: leaking `C.CString` memory, passing unpinned Go pointers to C, ignoring C return codes.
    

Comments (0)

Sign in to join the conversation.

No comments yet.

Reviews (0)

No reviews yet.

Related