[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BV66VR3Y8DRYJCNG3H5909":3,"skill-same:01M6BV66VR3Y8DRYJCNG3H5909":69},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":38,"linkOnly":39,"markdownContent":40,"markdownBody":41,"frontMatter":42,"refName":43,"commitSha":44,"skillDirectory":45,"forksCount":14,"repositoryHtmlUrl":46,"repositoryHomepageUrl":6,"ownerHtmlUrl":47,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":48,"install":49,"resources":62},"01M6BV66VR3Y8DRYJCNG3H5909","go-concurrency-patterns",null,"Master Go concurrency with goroutines, channels, sync primitives, and context. Use when building concurrent Go applications, implementing worker pools, or debugging race conditions.","bnferguson\u002Fdotfiles","bnferguson","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F47749?v=4","01M6BV4H2TJKK8P14W86V1ZCPP","Brandon Ferguson","01M6BV4H7GJWTZJ1BVHQ1TX11Y",0,"MIT","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgo-concurrency-patterns\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37],"concurrency patterns","concurrency","go concurrency patterns","go concurrency","go","patterns","master","when","implementing","with","channels","goroutines","worker","use","primitives","context","applications","debugging","sync","2026-11-10 10:12:30",false,"---\nname: go-concurrency-patterns\ndescription: Master Go concurrency with goroutines, channels, sync primitives, and context. Use when building concurrent Go applications, implementing worker pools, or debugging race conditions.\n---\n\n# Go Concurrency Patterns\n\nProduction patterns for Go concurrency including goroutines, channels, synchronization primitives, and context management.\n\n## When to Use This Skill\n\n- Building concurrent Go applications\n- Implementing worker pools and pipelines\n- Managing goroutine lifecycles\n- Using channels for communication\n- Debugging race conditions\n- Implementing graceful shutdown\n\n## Core Concepts\n\n### Primitives\n\n| Primitive | Purpose |\n|-----------|---------|\n| `goroutine` | Lightweight concurrent execution |\n| `channel` | Communication between goroutines |\n| `select` | Multiplex channel operations |\n| `sync.Mutex` | Mutual exclusion |\n| `sync.WaitGroup` | Wait for goroutines to complete |\n| `context.Context` | Cancellation and deadlines |\n\n### Go Concurrency Mantra\n\n```\nDon't communicate by sharing memory;\nshare memory by communicating.\n```\n\n## Quick Start\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"sync\"\n    \"time\"\n)\n\nfunc main() {\n    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\n    defer cancel()\n\n    results := make(chan string, 10)\n    var wg sync.WaitGroup\n\n    for i := 0; i \u003C 3; i++ {\n        wg.Add(1)\n        go worker(ctx, i, results, &wg)\n    }\n\n    go func() {\n        wg.Wait()\n        close(results)\n    }()\n\n    for result := range results {\n        fmt.Println(result)\n    }\n}\n\nfunc worker(ctx context.Context, id int, results chan\u003C- string, wg *sync.WaitGroup) {\n    defer wg.Done()\n\n    select {\n    case \u003C-ctx.Done():\n        return\n    case results \u003C- fmt.Sprintf(\"Worker %d done\", id):\n    }\n}\n```\n\n## Patterns\n\nLoad `references\u002Fpatterns.md` for full implementations of these patterns:\n\n1. **Worker Pool** — Fixed number of goroutines consuming from a shared job channel\n2. **Fan-In** — Pipeline stages with multiple workers merging into one output channel\n3. **Bounded Concurrency** — Semaphore-based rate limiting with `golang.org\u002Fx\u002Fsync\u002Fsemaphore`\n4. **Graceful Shutdown** — Signal handling, context cancellation, WaitGroup drain with timeout\n5. **Error Group** — `golang.org\u002Fx\u002Fsync\u002Ferrgroup` for concurrent ops with first-error cancellation\n6. **Concurrent Map** — `sync.Map` for read-heavy, sharded map for write-heavy workloads\n7. **Select Patterns** — Timeout, non-blocking send\u002Freceive, priority select\n\n## Race Detection\n\n```bash\n# Run tests with race detector\ngo test -race .\u002F...\n\n# Build with race detector\ngo build -race .\n\n# Run with race detector\ngo run -race main.go\n```\n\n## Best Practices\n\n### Do's\n- **Use context** — For cancellation and deadlines\n- **Close channels** — From sender side only\n- **Use errgroup** — For concurrent operations with errors\n- **Buffer channels** — When you know the count\n- **Prefer channels** — Over mutexes when possible\n\n### Don'ts\n- **Don't leak goroutines** — Always have exit path\n- **Don't close from receiver** — Causes panic\n- **Don't use shared memory** — Unless necessary\n- **Don't ignore context cancellation** — Check ctx.Done()\n- **Don't use time.Sleep for sync** — Use proper primitives\n\n## Resources\n\n- [Go Concurrency Patterns](https:\u002F\u002Fgo.dev\u002Fblog\u002Fpipelines)\n- [Effective Go - Concurrency](https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go#concurrency)\n- [Go by Example - Goroutines](https:\u002F\u002Fgobyexample.com\u002Fgoroutines)\n","# Go Concurrency Patterns\n\nProduction patterns for Go concurrency including goroutines, channels, synchronization primitives, and context management.\n\n## When to Use This Skill\n\n- Building concurrent Go applications\n- Implementing worker pools and pipelines\n- Managing goroutine lifecycles\n- Using channels for communication\n- Debugging race conditions\n- Implementing graceful shutdown\n\n## Core Concepts\n\n### Primitives\n\n| Primitive | Purpose |\n|-----------|---------|\n| `goroutine` | Lightweight concurrent execution |\n| `channel` | Communication between goroutines |\n| `select` | Multiplex channel operations |\n| `sync.Mutex` | Mutual exclusion |\n| `sync.WaitGroup` | Wait for goroutines to complete |\n| `context.Context` | Cancellation and deadlines |\n\n### Go Concurrency Mantra\n\n```\nDon't communicate by sharing memory;\nshare memory by communicating.\n```\n\n## Quick Start\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"sync\"\n    \"time\"\n)\n\nfunc main() {\n    ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)\n    defer cancel()\n\n    results := make(chan string, 10)\n    var wg sync.WaitGroup\n\n    for i := 0; i \u003C 3; i++ {\n        wg.Add(1)\n        go worker(ctx, i, results, &wg)\n    }\n\n    go func() {\n        wg.Wait()\n        close(results)\n    }()\n\n    for result := range results {\n        fmt.Println(result)\n    }\n}\n\nfunc worker(ctx context.Context, id int, results chan\u003C- string, wg *sync.WaitGroup) {\n    defer wg.Done()\n\n    select {\n    case \u003C-ctx.Done():\n        return\n    case results \u003C- fmt.Sprintf(\"Worker %d done\", id):\n    }\n}\n```\n\n## Patterns\n\nLoad `references\u002Fpatterns.md` for full implementations of these patterns:\n\n1. **Worker Pool** — Fixed number of goroutines consuming from a shared job channel\n2. **Fan-In** — Pipeline stages with multiple workers merging into one output channel\n3. **Bounded Concurrency** — Semaphore-based rate limiting with `golang.org\u002Fx\u002Fsync\u002Fsemaphore`\n4. **Graceful Shutdown** — Signal handling, context cancellation, WaitGroup drain with timeout\n5. **Error Group** — `golang.org\u002Fx\u002Fsync\u002Ferrgroup` for concurrent ops with first-error cancellation\n6. **Concurrent Map** — `sync.Map` for read-heavy, sharded map for write-heavy workloads\n7. **Select Patterns** — Timeout, non-blocking send\u002Freceive, priority select\n\n## Race Detection\n\n```bash\n# Run tests with race detector\ngo test -race .\u002F...\n\n# Build with race detector\ngo build -race .\n\n# Run with race detector\ngo run -race main.go\n```\n\n## Best Practices\n\n### Do's\n- **Use context** — For cancellation and deadlines\n- **Close channels** — From sender side only\n- **Use errgroup** — For concurrent operations with errors\n- **Buffer channels** — When you know the count\n- **Prefer channels** — Over mutexes when possible\n\n### Don'ts\n- **Don't leak goroutines** — Always have exit path\n- **Don't close from receiver** — Causes panic\n- **Don't use shared memory** — Unless necessary\n- **Don't ignore context cancellation** — Check ctx.Done()\n- **Don't use time.Sleep for sync** — Use proper primitives\n\n## Resources\n\n- [Go Concurrency Patterns](https:\u002F\u002Fgo.dev\u002Fblog\u002Fpipelines)\n- [Effective Go - Concurrency](https:\u002F\u002Fgo.dev\u002Fdoc\u002Feffective_go#concurrency)\n- [Go by Example - Goroutines](https:\u002F\u002Fgobyexample.com\u002Fgoroutines)\n",{"name":5,"description":7},"main","e63965e4644984470d4cc8b3014a8b001f0c2666",".agents\u002Fskills\u002Fgo-concurrency-patterns","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles","https:\u002F\u002Fgithub.com\u002Fbnferguson","2026-11-11 03:04:59",{"source":8,"skillName":5,"commands":50,"prompt":60,"zipAvailable":61},[51,54,57],{"tool":52,"command":53},"npx","npx skills add bnferguson\u002Fdotfiles --skill go-concurrency-patterns",{"tool":55,"command":56},"bunx","bunx skills add bnferguson\u002Fdotfiles --skill go-concurrency-patterns",{"tool":58,"command":59},"pnpm","pnpm dlx skills add bnferguson\u002Fdotfiles --skill go-concurrency-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgo-concurrency-patterns\u002FSKILL.md",true,[63],{"path":64,"resourceType":65,"resourceTypeDesc":66,"sizeBytes":67,"sourceHtmlUrl":68},"references\u002Fpatterns.md","REFERENCE","参考文档",10076,"https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fgo-concurrency-patterns\u002Freferences\u002Fpatterns.md",[70,101,118,146,155,168],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":74,"licenseFileUrl":75,"sourceHtmlUrl":76,"categories":77,"keywords":83,"publishedAt":38},"01M6BVA3RS3M016FANZ6792F9H","skill-creator","Guide for creating effective skills. This skill should be used when users want to create a new skill (or update an existing skill) that extends Claude's capabilities with specialized knowledge, workflows, or tool integrations.","Apache-2.0","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002Fclaude\u002Fconfig\u002Fskills\u002Fskill-creator\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002Fclaude\u002Fconfig\u002Fskills\u002Fskill-creator\u002FSKILL.md",[78],{"categoryNo":79,"categoryName":80,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",[84,85,86,87,88,89,90,91,92,93,94,95,96,97,28,98,99,26,100],"creator","skill creator","specialized","workflows","create","update","capabilities","knowledge","tool","integrations","guide","new skill","existing skill","users","for","Existing","new",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":115,"publishedAt":38},"01M6BV94WN2RPYM8N6PN8TBNT8","writing-shape","Writing, exploit: shape raw material into an article, paragraph by paragraph.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwriting-shape\u002FSKILL.md",[107,110],{"categoryNo":108,"categoryName":109,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000018","写作与文案",{"categoryNo":111,"categoryName":112,"taxonomyType":113,"taxonomyTypeDesc":114},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[116,117],"writing shape","writing",{"skillNo":119,"name":120,"nameZh":6,"description":121,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":74,"licenseFileUrl":122,"sourceHtmlUrl":123,"categories":124,"keywords":131,"publishedAt":38},"01M6BV8QDFJ6PXBVK5NFBZT5M7","webapp-testing","Test local web applications using Playwright. Use when verifying frontend functionality, debugging UI behavior, capturing browser screenshots, or viewing browser logs.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FLICENSE.txt","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwebapp-testing\u002FSKILL.md",[125,128],{"categoryNo":126,"categoryName":127,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000008","测试与质量",{"categoryNo":129,"categoryName":130,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000009","前端开发",[132,133,134,135,136,137,138,139,140,36,141,142,35,143,32,144,145,26],"webapp","webapp testing","testing","browser","frontend","screenshots","playwright","test","web","ui","logs","behavior","local","test local",{"skillNo":147,"name":148,"nameZh":6,"description":149,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":150,"categories":151,"keywords":152,"publishedAt":38},"01M6BV8MDXKXNVHKS3QF3YDFTF","wait-what","Stop. That last message did not land: re-pitch it.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fwait-what\u002FSKILL.md",[],[153,154],"wait what","land",{"skillNo":156,"name":157,"nameZh":6,"description":158,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":159,"categories":160,"keywords":164,"publishedAt":38},"01M6BV756DJHT5BDA1HVRVHJJ7","prototype","Build a throwaway prototype to answer a design question. Use when the user wants to sanity-check whether a state model or logic feels right, or explore what a UI should look like.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fprototype\u002FSKILL.md",[161],{"categoryNo":162,"categoryName":163,"taxonomyType":113,"taxonomyTypeDesc":114},"01JBSEEDCAT000000000000032","设计师",[157,165,166,141,167],"design","explore","state",{"skillNo":169,"name":170,"nameZh":6,"description":171,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":172,"categories":173,"keywords":175,"publishedAt":38},"01M6BV6SBW166685KVBPWM2K4N","improve-codebase-architecture","Scan a codebase for deepening opportunities, present them as a visual HTML report, then grill through whichever one you pick.","https:\u002F\u002Fgithub.com\u002Fbnferguson\u002Fdotfiles\u002Fblob\u002Fmain\u002F.agents\u002Fskills\u002Fimprove-codebase-architecture\u002FSKILL.md",[174],{"categoryNo":129,"categoryName":130,"taxonomyType":81,"taxonomyTypeDesc":82},[176,177,178,179],"architecture","improve","improve codebase architecture","report"]