@zimezone/z-command 1.1.1 → 1.1.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/README.md +13 -1
  2. package/dist/commands/init.d.ts.map +1 -1
  3. package/dist/commands/init.js +34 -9
  4. package/dist/commands/init.js.map +1 -1
  5. package/package.json +8 -3
  6. package/templates.zip +0 -0
  7. package/templates/agents/accessibility-expert.agent.md +0 -56
  8. package/templates/agents/ai-engineer.agent.md +0 -61
  9. package/templates/agents/angular-architect.agent.md +0 -49
  10. package/templates/agents/api-designer.agent.md +0 -40
  11. package/templates/agents/api-documenter.agent.md +0 -161
  12. package/templates/agents/architect-review.agent.md +0 -146
  13. package/templates/agents/arm-cortex-expert.agent.md +0 -288
  14. package/templates/agents/azure-infra-engineer.agent.md +0 -57
  15. package/templates/agents/backend-architect.agent.md +0 -309
  16. package/templates/agents/backend-developer.agent.md +0 -61
  17. package/templates/agents/backend-security-coder.agent.md +0 -152
  18. package/templates/agents/bash-pro.agent.md +0 -285
  19. package/templates/agents/blockchain-developer.agent.md +0 -57
  20. package/templates/agents/build-engineer.agent.md +0 -56
  21. package/templates/agents/business-analyst.agent.md +0 -47
  22. package/templates/agents/c-pro.agent.md +0 -35
  23. package/templates/agents/c4-code.agent.md +0 -320
  24. package/templates/agents/c4-component.agent.md +0 -227
  25. package/templates/agents/c4-container.agent.md +0 -248
  26. package/templates/agents/c4-context.agent.md +0 -235
  27. package/templates/agents/cli-developer.agent.md +0 -57
  28. package/templates/agents/cloud-architect.agent.md +0 -56
  29. package/templates/agents/code-architect.agent.md +0 -63
  30. package/templates/agents/code-reviewer.agent.md +0 -49
  31. package/templates/agents/competitive-analyst.agent.md +0 -48
  32. package/templates/agents/conductor-validator.agent.md +0 -245
  33. package/templates/agents/context-manager.agent.md +0 -55
  34. package/templates/agents/cpp-pro.agent.md +0 -59
  35. package/templates/agents/csharp-developer.agent.md +0 -57
  36. package/templates/agents/csharp-pro.agent.md +0 -38
  37. package/templates/agents/customer-support.agent.md +0 -148
  38. package/templates/agents/data-engineer.agent.md +0 -55
  39. package/templates/agents/data-researcher.agent.md +0 -55
  40. package/templates/agents/data-scientist.agent.md +0 -56
  41. package/templates/agents/database-admin.agent.md +0 -142
  42. package/templates/agents/database-administrator.agent.md +0 -50
  43. package/templates/agents/database-architect.agent.md +0 -238
  44. package/templates/agents/database-optimizer.agent.md +0 -144
  45. package/templates/agents/debugger.agent.md +0 -30
  46. package/templates/agents/deployment-engineer.agent.md +0 -0
  47. package/templates/agents/devops-engineer.agent.md +0 -59
  48. package/templates/agents/devops-troubleshooter.agent.md +0 -138
  49. package/templates/agents/django-developer.agent.md +0 -50
  50. package/templates/agents/django-pro.agent.md +0 -159
  51. package/templates/agents/docs-architect.agent.md +0 -77
  52. package/templates/agents/documentation-engineer.agent.md +0 -57
  53. package/templates/agents/dotnet-architect.agent.md +0 -175
  54. package/templates/agents/dx-optimizer.agent.md +0 -63
  55. package/templates/agents/electron-pro.agent.md +0 -56
  56. package/templates/agents/elixir-pro.agent.md +0 -38
  57. package/templates/agents/embedded-systems.agent.md +0 -55
  58. package/templates/agents/error-detective.agent.md +0 -32
  59. package/templates/agents/event-sourcing-architect.agent.md +0 -42
  60. package/templates/agents/fastapi-pro.agent.md +0 -171
  61. package/templates/agents/fintech-engineer.agent.md +0 -57
  62. package/templates/agents/firmware-analyst.agent.md +0 -330
  63. package/templates/agents/flutter-expert.agent.md +0 -50
  64. package/templates/agents/frontend-developer.agent.md +0 -59
  65. package/templates/agents/frontend-security-coder.agent.md +0 -149
  66. package/templates/agents/fullstack-developer.agent.md +0 -46
  67. package/templates/agents/git-workflow-manager.agent.md +0 -57
  68. package/templates/agents/golang-pro.agent.md +0 -50
  69. package/templates/agents/graphql-architect.agent.md +0 -48
  70. package/templates/agents/haskell-pro.agent.md +0 -37
  71. package/templates/agents/hr-pro.agent.md +0 -105
  72. package/templates/agents/incident-responder.agent.md +0 -190
  73. package/templates/agents/ios-developer.agent.md +0 -198
  74. package/templates/agents/iot-engineer.agent.md +0 -56
  75. package/templates/agents/java-architect.agent.md +0 -48
  76. package/templates/agents/java-pro.agent.md +0 -156
  77. package/templates/agents/javascript-pro.agent.md +0 -35
  78. package/templates/agents/julia-pro.agent.md +0 -187
  79. package/templates/agents/kotlin-specialist.agent.md +0 -50
  80. package/templates/agents/laravel-specialist.agent.md +0 -50
  81. package/templates/agents/legacy-modernizer.agent.md +0 -56
  82. package/templates/agents/legal-advisor.agent.md +0 -49
  83. package/templates/agents/llm-architect.agent.md +0 -58
  84. package/templates/agents/malware-analyst.agent.md +0 -272
  85. package/templates/agents/mcp-developer.agent.md +0 -54
  86. package/templates/agents/mermaid-expert.agent.md +0 -39
  87. package/templates/agents/microservices-architect.agent.md +0 -47
  88. package/templates/agents/minecraft-bukkit-pro.agent.md +0 -104
  89. package/templates/agents/ml-engineer.agent.md +0 -56
  90. package/templates/agents/mlops-engineer.agent.md +0 -56
  91. package/templates/agents/mobile-developer.agent.md +0 -45
  92. package/templates/agents/mobile-security-coder.agent.md +0 -163
  93. package/templates/agents/monorepo-architect.agent.md +0 -44
  94. package/templates/agents/multi-agent-coordinator.agent.md +0 -55
  95. package/templates/agents/network-engineer.agent.md +0 -57
  96. package/templates/agents/nextjs-developer.agent.md +0 -48
  97. package/templates/agents/nlp-engineer.agent.md +0 -58
  98. package/templates/agents/observability-engineer.agent.md +0 -228
  99. package/templates/agents/payment-integration.agent.md +0 -56
  100. package/templates/agents/performance-engineer.agent.md +0 -167
  101. package/templates/agents/performance-optimizer.agent.md +0 -57
  102. package/templates/agents/php-pro.agent.md +0 -43
  103. package/templates/agents/platform-engineer.agent.md +0 -57
  104. package/templates/agents/posix-shell-pro.agent.md +0 -284
  105. package/templates/agents/postgres-pro.agent.md +0 -58
  106. package/templates/agents/product-manager.agent.md +0 -55
  107. package/templates/agents/project-manager.agent.md +0 -57
  108. package/templates/agents/prompt-engineer.agent.md +0 -58
  109. package/templates/agents/python-pro.agent.md +0 -48
  110. package/templates/agents/quant-analyst.agent.md +0 -32
  111. package/templates/agents/rails-expert.agent.md +0 -50
  112. package/templates/agents/react-specialist.agent.md +0 -49
  113. package/templates/agents/refactoring-specialist.agent.md +0 -56
  114. package/templates/agents/reference-builder.agent.md +0 -167
  115. package/templates/agents/research-analyst.agent.md +0 -63
  116. package/templates/agents/reverse-engineer.agent.md +0 -202
  117. package/templates/agents/risk-manager.agent.md +0 -41
  118. package/templates/agents/ruby-pro.agent.md +0 -35
  119. package/templates/agents/rust-pro.agent.md +0 -156
  120. package/templates/agents/sales-automator.agent.md +0 -35
  121. package/templates/agents/scala-pro.agent.md +0 -60
  122. package/templates/agents/scrum-master.agent.md +0 -54
  123. package/templates/agents/search-specialist.agent.md +0 -59
  124. package/templates/agents/security-analyst.agent.md +0 -57
  125. package/templates/agents/security-auditor.agent.md +0 -138
  126. package/templates/agents/security-engineer.agent.md +0 -57
  127. package/templates/agents/seo-authority-builder.agent.md +0 -116
  128. package/templates/agents/seo-cannibalization-detector.agent.md +0 -103
  129. package/templates/agents/seo-content-auditor.agent.md +0 -63
  130. package/templates/agents/seo-content-planner.agent.md +0 -88
  131. package/templates/agents/seo-content-refresher.agent.md +0 -98
  132. package/templates/agents/seo-content-writer.agent.md +0 -76
  133. package/templates/agents/seo-keyword-strategist.agent.md +0 -75
  134. package/templates/agents/seo-meta-optimizer.agent.md +0 -72
  135. package/templates/agents/seo-snippet-hunter.agent.md +0 -94
  136. package/templates/agents/seo-specialist.agent.md +0 -57
  137. package/templates/agents/seo-structure-architect.agent.md +0 -88
  138. package/templates/agents/service-mesh-expert.agent.md +0 -41
  139. package/templates/agents/sql-pro.agent.md +0 -146
  140. package/templates/agents/sre-engineer.agent.md +0 -58
  141. package/templates/agents/swift-expert.agent.md +0 -49
  142. package/templates/agents/task-distributor.agent.md +0 -47
  143. package/templates/agents/tdd-orchestrator.agent.md +0 -183
  144. package/templates/agents/technical-writer.agent.md +0 -48
  145. package/templates/agents/temporal-python-pro.agent.md +0 -349
  146. package/templates/agents/terraform-engineer.agent.md +0 -57
  147. package/templates/agents/terraform-specialist.agent.md +0 -137
  148. package/templates/agents/test-automator.agent.md +0 -203
  149. package/templates/agents/test-engineer.agent.md +0 -55
  150. package/templates/agents/threat-modeling-expert.agent.md +0 -44
  151. package/templates/agents/trend-analyst.agent.md +0 -47
  152. package/templates/agents/tutorial-engineer.agent.md +0 -118
  153. package/templates/agents/typescript-pro.agent.md +0 -48
  154. package/templates/agents/ui-designer.agent.md +0 -48
  155. package/templates/agents/ui-ux-designer.agent.md +0 -188
  156. package/templates/agents/ui-visual-validator.agent.md +0 -192
  157. package/templates/agents/ux-researcher.agent.md +0 -48
  158. package/templates/agents/vector-database-engineer.agent.md +0 -43
  159. package/templates/agents/vue-expert.agent.md +0 -48
  160. package/templates/agents/websocket-engineer.agent.md +0 -49
  161. package/templates/agents/workflow-orchestrator.agent.md +0 -48
  162. package/templates/skills/angular-migration/SKILL.md +0 -410
  163. package/templates/skills/api-design-principles/SKILL.md +0 -528
  164. package/templates/skills/api-design-principles/assets/api-design-checklist.md +0 -155
  165. package/templates/skills/api-design-principles/assets/rest-api-template.py +0 -182
  166. package/templates/skills/api-design-principles/references/graphql-schema-design.md +0 -583
  167. package/templates/skills/api-design-principles/references/rest-best-practices.md +0 -408
  168. package/templates/skills/architecture-decision-records/SKILL.md +0 -428
  169. package/templates/skills/architecture-patterns/SKILL.md +0 -494
  170. package/templates/skills/async-python-patterns/SKILL.md +0 -694
  171. package/templates/skills/auth-implementation-patterns/SKILL.md +0 -634
  172. package/templates/skills/changelog-automation/SKILL.md +0 -552
  173. package/templates/skills/code-review/SKILL.md +0 -62
  174. package/templates/skills/code-review-excellence/SKILL.md +0 -520
  175. package/templates/skills/competitive-landscape/SKILL.md +0 -479
  176. package/templates/skills/context-driven-development/SKILL.md +0 -385
  177. package/templates/skills/cost-optimization/SKILL.md +0 -274
  178. package/templates/skills/cqrs-implementation/SKILL.md +0 -554
  179. package/templates/skills/data-quality-frameworks/SKILL.md +0 -587
  180. package/templates/skills/data-storytelling/SKILL.md +0 -453
  181. package/templates/skills/database-migration/SKILL.md +0 -424
  182. package/templates/skills/dbt-transformation-patterns/SKILL.md +0 -561
  183. package/templates/skills/debugging-strategies/SKILL.md +0 -527
  184. package/templates/skills/defi-protocol-templates/SKILL.md +0 -454
  185. package/templates/skills/dependency-upgrade/SKILL.md +0 -409
  186. package/templates/skills/deployment-pipeline-design/SKILL.md +0 -359
  187. package/templates/skills/distributed-tracing/SKILL.md +0 -438
  188. package/templates/skills/dotnet-backend-patterns/SKILL.md +0 -815
  189. package/templates/skills/dotnet-backend-patterns/assets/repository-template.cs +0 -523
  190. package/templates/skills/dotnet-backend-patterns/assets/service-template.cs +0 -336
  191. package/templates/skills/dotnet-backend-patterns/references/dapper-patterns.md +0 -544
  192. package/templates/skills/dotnet-backend-patterns/references/ef-core-best-practices.md +0 -355
  193. package/templates/skills/e2e-testing-patterns/SKILL.md +0 -547
  194. package/templates/skills/employment-contract-templates/SKILL.md +0 -507
  195. package/templates/skills/error-handling-patterns/SKILL.md +0 -636
  196. package/templates/skills/event-store-design/SKILL.md +0 -437
  197. package/templates/skills/fastapi-templates/SKILL.md +0 -567
  198. package/templates/skills/git-advanced-workflows/SKILL.md +0 -400
  199. package/templates/skills/github-actions-templates/SKILL.md +0 -333
  200. package/templates/skills/go-concurrency-patterns/SKILL.md +0 -655
  201. package/templates/skills/grafana-dashboards/SKILL.md +0 -369
  202. package/templates/skills/helm-chart-scaffolding/SKILL.md +0 -544
  203. package/templates/skills/helm-chart-scaffolding/assets/Chart.yaml.template +0 -42
  204. package/templates/skills/helm-chart-scaffolding/assets/values.yaml.template +0 -185
  205. package/templates/skills/helm-chart-scaffolding/references/chart-structure.md +0 -500
  206. package/templates/skills/helm-chart-scaffolding/scripts/validate-chart.sh +0 -244
  207. package/templates/skills/javascript-testing-patterns/SKILL.md +0 -1025
  208. package/templates/skills/langchain-architecture/SKILL.md +0 -338
  209. package/templates/skills/llm-evaluation/SKILL.md +0 -471
  210. package/templates/skills/microservices-patterns/SKILL.md +0 -595
  211. package/templates/skills/modern-javascript-patterns/SKILL.md +0 -911
  212. package/templates/skills/monorepo-management/SKILL.md +0 -622
  213. package/templates/skills/nextjs-app-router-patterns/SKILL.md +0 -544
  214. package/templates/skills/nodejs-backend-patterns/SKILL.md +0 -1020
  215. package/templates/skills/nx-workspace-patterns/SKILL.md +0 -452
  216. package/templates/skills/openapi-spec-generation/SKILL.md +0 -1028
  217. package/templates/skills/paypal-integration/SKILL.md +0 -467
  218. package/templates/skills/pci-compliance/SKILL.md +0 -466
  219. package/templates/skills/postgresql/SKILL.md +0 -204
  220. package/templates/skills/projection-patterns/SKILL.md +0 -490
  221. package/templates/skills/prometheus-configuration/SKILL.md +0 -392
  222. package/templates/skills/prompt-engineering-patterns/SKILL.md +0 -201
  223. package/templates/skills/prompt-engineering-patterns/assets/few-shot-examples.json +0 -106
  224. package/templates/skills/prompt-engineering-patterns/assets/prompt-template-library.md +0 -246
  225. package/templates/skills/prompt-engineering-patterns/references/chain-of-thought.md +0 -399
  226. package/templates/skills/prompt-engineering-patterns/references/few-shot-learning.md +0 -369
  227. package/templates/skills/prompt-engineering-patterns/references/prompt-optimization.md +0 -414
  228. package/templates/skills/prompt-engineering-patterns/references/prompt-templates.md +0 -470
  229. package/templates/skills/prompt-engineering-patterns/references/system-prompts.md +0 -189
  230. package/templates/skills/prompt-engineering-patterns/scripts/optimize-prompt.py +0 -279
  231. package/templates/skills/python-packaging/SKILL.md +0 -870
  232. package/templates/skills/python-performance-optimization/SKILL.md +0 -869
  233. package/templates/skills/python-testing-patterns/SKILL.md +0 -907
  234. package/templates/skills/rag-implementation/SKILL.md +0 -403
  235. package/templates/skills/react-modernization/SKILL.md +0 -513
  236. package/templates/skills/react-native-architecture/SKILL.md +0 -671
  237. package/templates/skills/react-state-management/SKILL.md +0 -429
  238. package/templates/skills/risk-metrics-calculation/SKILL.md +0 -555
  239. package/templates/skills/rust-async-patterns/SKILL.md +0 -517
  240. package/templates/skills/secrets-management/SKILL.md +0 -346
  241. package/templates/skills/security-requirement-extraction/SKILL.md +0 -677
  242. package/templates/skills/security-review/SKILL.md +0 -78
  243. package/templates/skills/shellcheck-configuration/SKILL.md +0 -454
  244. package/templates/skills/similarity-search-patterns/SKILL.md +0 -558
  245. package/templates/skills/slo-implementation/SKILL.md +0 -329
  246. package/templates/skills/sql-optimization-patterns/SKILL.md +0 -493
  247. package/templates/skills/stripe-integration/SKILL.md +0 -442
  248. package/templates/skills/systematic-debugging/SKILL.md +0 -57
  249. package/templates/skills/tailwind-design-system/SKILL.md +0 -666
  250. package/templates/skills/temporal-python-testing/SKILL.md +0 -158
  251. package/templates/skills/temporal-python-testing/resources/integration-testing.md +0 -455
  252. package/templates/skills/temporal-python-testing/resources/local-setup.md +0 -553
  253. package/templates/skills/temporal-python-testing/resources/replay-testing.md +0 -462
  254. package/templates/skills/temporal-python-testing/resources/unit-testing.md +0 -328
  255. package/templates/skills/terraform-module-library/SKILL.md +0 -249
  256. package/templates/skills/terraform-module-library/references/aws-modules.md +0 -63
  257. package/templates/skills/test-driven-development/SKILL.md +0 -46
  258. package/templates/skills/threat-mitigation-mapping/SKILL.md +0 -745
  259. package/templates/skills/track-management/SKILL.md +0 -593
  260. package/templates/skills/typescript-advanced-types/SKILL.md +0 -717
  261. package/templates/skills/ui-ux-pro-max/SKILL.md +0 -352
  262. package/templates/skills/ui-ux-pro-max/data/charts.csv +0 -26
  263. package/templates/skills/ui-ux-pro-max/data/colors.csv +0 -97
  264. package/templates/skills/ui-ux-pro-max/data/icons.csv +0 -101
  265. package/templates/skills/ui-ux-pro-max/data/landing.csv +0 -31
  266. package/templates/skills/ui-ux-pro-max/data/products.csv +0 -97
  267. package/templates/skills/ui-ux-pro-max/data/prompts.csv +0 -24
  268. package/templates/skills/ui-ux-pro-max/data/react-performance.csv +0 -45
  269. package/templates/skills/ui-ux-pro-max/data/styles.csv +0 -59
  270. package/templates/skills/ui-ux-pro-max/data/typography.csv +0 -58
  271. package/templates/skills/ui-ux-pro-max/data/ui-reasoning.csv +0 -101
  272. package/templates/skills/ui-ux-pro-max/data/ux-guidelines.csv +0 -100
  273. package/templates/skills/ui-ux-pro-max/data/web-interface.csv +0 -31
  274. package/templates/skills/ui-ux-pro-max/scripts/core.py +0 -258
  275. package/templates/skills/ui-ux-pro-max/scripts/design_system.py +0 -547
  276. package/templates/skills/ui-ux-pro-max/scripts/search.py +0 -76
  277. package/templates/skills/uv-package-manager/SKILL.md +0 -831
  278. package/templates/skills/vector-index-tuning/SKILL.md +0 -521
  279. package/templates/skills/wcag-audit-patterns/SKILL.md +0 -555
  280. package/templates/skills/workflow-orchestration-patterns/SKILL.md +0 -316
  281. package/templates/skills/workflow-patterns/SKILL.md +0 -623
  282. package/templates/skills/writing-plans/SKILL.md +0 -64
@@ -1,655 +0,0 @@
1
- ---
2
- name: go-concurrency-patterns
3
- description: Master Go concurrency with goroutines, channels, sync primitives, and context. Use when building concurrent Go applications, implementing worker pools, or debugging race conditions.
4
- ---
5
-
6
- # Go Concurrency Patterns
7
-
8
- Production patterns for Go concurrency including goroutines, channels, synchronization primitives, and context management.
9
-
10
- ## When to Use This Skill
11
-
12
- - Building concurrent Go applications
13
- - Implementing worker pools and pipelines
14
- - Managing goroutine lifecycles
15
- - Using channels for communication
16
- - Debugging race conditions
17
- - Implementing graceful shutdown
18
-
19
- ## Core Concepts
20
-
21
- ### 1. Go Concurrency Primitives
22
-
23
- | Primitive | Purpose |
24
- |-----------|---------|
25
- | `goroutine` | Lightweight concurrent execution |
26
- | `channel` | Communication between goroutines |
27
- | `select` | Multiplex channel operations |
28
- | `sync.Mutex` | Mutual exclusion |
29
- | `sync.WaitGroup` | Wait for goroutines to complete |
30
- | `context.Context` | Cancellation and deadlines |
31
-
32
- ### 2. Go Concurrency Mantra
33
-
34
- ```
35
- Don't communicate by sharing memory;
36
- share memory by communicating.
37
- ```
38
-
39
- ## Quick Start
40
-
41
- ```go
42
- package main
43
-
44
- import (
45
- "context"
46
- "fmt"
47
- "sync"
48
- "time"
49
- )
50
-
51
- func main() {
52
- ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
53
- defer cancel()
54
-
55
- results := make(chan string, 10)
56
- var wg sync.WaitGroup
57
-
58
- // Spawn workers
59
- for i := 0; i < 3; i++ {
60
- wg.Add(1)
61
- go worker(ctx, i, results, &wg)
62
- }
63
-
64
- // Close results when done
65
- go func() {
66
- wg.Wait()
67
- close(results)
68
- }()
69
-
70
- // Collect results
71
- for result := range results {
72
- fmt.Println(result)
73
- }
74
- }
75
-
76
- func worker(ctx context.Context, id int, results chan<- string, wg *sync.WaitGroup) {
77
- defer wg.Done()
78
-
79
- select {
80
- case <-ctx.Done():
81
- return
82
- case results <- fmt.Sprintf("Worker %d done", id):
83
- }
84
- }
85
- ```
86
-
87
- ## Patterns
88
-
89
- ### Pattern 1: Worker Pool
90
-
91
- ```go
92
- package main
93
-
94
- import (
95
- "context"
96
- "fmt"
97
- "sync"
98
- )
99
-
100
- type Job struct {
101
- ID int
102
- Data string
103
- }
104
-
105
- type Result struct {
106
- JobID int
107
- Output string
108
- Err error
109
- }
110
-
111
- func WorkerPool(ctx context.Context, numWorkers int, jobs <-chan Job) <-chan Result {
112
- results := make(chan Result, len(jobs))
113
-
114
- var wg sync.WaitGroup
115
- for i := 0; i < numWorkers; i++ {
116
- wg.Add(1)
117
- go func(workerID int) {
118
- defer wg.Done()
119
- for job := range jobs {
120
- select {
121
- case <-ctx.Done():
122
- return
123
- default:
124
- result := processJob(job)
125
- results <- result
126
- }
127
- }
128
- }(i)
129
- }
130
-
131
- go func() {
132
- wg.Wait()
133
- close(results)
134
- }()
135
-
136
- return results
137
- }
138
-
139
- func processJob(job Job) Result {
140
- // Simulate work
141
- return Result{
142
- JobID: job.ID,
143
- Output: fmt.Sprintf("Processed: %s", job.Data),
144
- }
145
- }
146
-
147
- // Usage
148
- func main() {
149
- ctx, cancel := context.WithCancel(context.Background())
150
- defer cancel()
151
-
152
- jobs := make(chan Job, 100)
153
-
154
- // Send jobs
155
- go func() {
156
- for i := 0; i < 50; i++ {
157
- jobs <- Job{ID: i, Data: fmt.Sprintf("job-%d", i)}
158
- }
159
- close(jobs)
160
- }()
161
-
162
- // Process with 5 workers
163
- results := WorkerPool(ctx, 5, jobs)
164
-
165
- for result := range results {
166
- fmt.Printf("Result: %+v\n", result)
167
- }
168
- }
169
- ```
170
-
171
- ### Pattern 2: Fan-Out/Fan-In Pipeline
172
-
173
- ```go
174
- package main
175
-
176
- import (
177
- "context"
178
- "sync"
179
- )
180
-
181
- // Stage 1: Generate numbers
182
- func generate(ctx context.Context, nums ...int) <-chan int {
183
- out := make(chan int)
184
- go func() {
185
- defer close(out)
186
- for _, n := range nums {
187
- select {
188
- case <-ctx.Done():
189
- return
190
- case out <- n:
191
- }
192
- }
193
- }()
194
- return out
195
- }
196
-
197
- // Stage 2: Square numbers (can run multiple instances)
198
- func square(ctx context.Context, in <-chan int) <-chan int {
199
- out := make(chan int)
200
- go func() {
201
- defer close(out)
202
- for n := range in {
203
- select {
204
- case <-ctx.Done():
205
- return
206
- case out <- n * n:
207
- }
208
- }
209
- }()
210
- return out
211
- }
212
-
213
- // Fan-in: Merge multiple channels into one
214
- func merge(ctx context.Context, cs ...<-chan int) <-chan int {
215
- var wg sync.WaitGroup
216
- out := make(chan int)
217
-
218
- // Start output goroutine for each input channel
219
- output := func(c <-chan int) {
220
- defer wg.Done()
221
- for n := range c {
222
- select {
223
- case <-ctx.Done():
224
- return
225
- case out <- n:
226
- }
227
- }
228
- }
229
-
230
- wg.Add(len(cs))
231
- for _, c := range cs {
232
- go output(c)
233
- }
234
-
235
- // Close out after all inputs are done
236
- go func() {
237
- wg.Wait()
238
- close(out)
239
- }()
240
-
241
- return out
242
- }
243
-
244
- func main() {
245
- ctx, cancel := context.WithCancel(context.Background())
246
- defer cancel()
247
-
248
- // Generate input
249
- in := generate(ctx, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
250
-
251
- // Fan out to multiple squarers
252
- c1 := square(ctx, in)
253
- c2 := square(ctx, in)
254
- c3 := square(ctx, in)
255
-
256
- // Fan in results
257
- for result := range merge(ctx, c1, c2, c3) {
258
- fmt.Println(result)
259
- }
260
- }
261
- ```
262
-
263
- ### Pattern 3: Bounded Concurrency with Semaphore
264
-
265
- ```go
266
- package main
267
-
268
- import (
269
- "context"
270
- "fmt"
271
- "golang.org/x/sync/semaphore"
272
- "sync"
273
- )
274
-
275
- type RateLimitedWorker struct {
276
- sem *semaphore.Weighted
277
- }
278
-
279
- func NewRateLimitedWorker(maxConcurrent int64) *RateLimitedWorker {
280
- return &RateLimitedWorker{
281
- sem: semaphore.NewWeighted(maxConcurrent),
282
- }
283
- }
284
-
285
- func (w *RateLimitedWorker) Do(ctx context.Context, tasks []func() error) []error {
286
- var (
287
- wg sync.WaitGroup
288
- mu sync.Mutex
289
- errors []error
290
- )
291
-
292
- for _, task := range tasks {
293
- // Acquire semaphore (blocks if at limit)
294
- if err := w.sem.Acquire(ctx, 1); err != nil {
295
- return []error{err}
296
- }
297
-
298
- wg.Add(1)
299
- go func(t func() error) {
300
- defer wg.Done()
301
- defer w.sem.Release(1)
302
-
303
- if err := t(); err != nil {
304
- mu.Lock()
305
- errors = append(errors, err)
306
- mu.Unlock()
307
- }
308
- }(task)
309
- }
310
-
311
- wg.Wait()
312
- return errors
313
- }
314
-
315
- // Alternative: Channel-based semaphore
316
- type Semaphore chan struct{}
317
-
318
- func NewSemaphore(n int) Semaphore {
319
- return make(chan struct{}, n)
320
- }
321
-
322
- func (s Semaphore) Acquire() {
323
- s <- struct{}{}
324
- }
325
-
326
- func (s Semaphore) Release() {
327
- <-s
328
- }
329
- ```
330
-
331
- ### Pattern 4: Graceful Shutdown
332
-
333
- ```go
334
- package main
335
-
336
- import (
337
- "context"
338
- "fmt"
339
- "os"
340
- "os/signal"
341
- "sync"
342
- "syscall"
343
- "time"
344
- )
345
-
346
- type Server struct {
347
- shutdown chan struct{}
348
- wg sync.WaitGroup
349
- }
350
-
351
- func NewServer() *Server {
352
- return &Server{
353
- shutdown: make(chan struct{}),
354
- }
355
- }
356
-
357
- func (s *Server) Start(ctx context.Context) {
358
- // Start workers
359
- for i := 0; i < 5; i++ {
360
- s.wg.Add(1)
361
- go s.worker(ctx, i)
362
- }
363
- }
364
-
365
- func (s *Server) worker(ctx context.Context, id int) {
366
- defer s.wg.Done()
367
- defer fmt.Printf("Worker %d stopped\n", id)
368
-
369
- ticker := time.NewTicker(time.Second)
370
- defer ticker.Stop()
371
-
372
- for {
373
- select {
374
- case <-ctx.Done():
375
- // Cleanup
376
- fmt.Printf("Worker %d cleaning up...\n", id)
377
- time.Sleep(500 * time.Millisecond) // Simulated cleanup
378
- return
379
- case <-ticker.C:
380
- fmt.Printf("Worker %d working...\n", id)
381
- }
382
- }
383
- }
384
-
385
- func (s *Server) Shutdown(timeout time.Duration) {
386
- // Signal shutdown
387
- close(s.shutdown)
388
-
389
- // Wait with timeout
390
- done := make(chan struct{})
391
- go func() {
392
- s.wg.Wait()
393
- close(done)
394
- }()
395
-
396
- select {
397
- case <-done:
398
- fmt.Println("Clean shutdown completed")
399
- case <-time.After(timeout):
400
- fmt.Println("Shutdown timed out, forcing exit")
401
- }
402
- }
403
-
404
- func main() {
405
- // Setup signal handling
406
- ctx, cancel := context.WithCancel(context.Background())
407
-
408
- sigCh := make(chan os.Signal, 1)
409
- signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM)
410
-
411
- server := NewServer()
412
- server.Start(ctx)
413
-
414
- // Wait for signal
415
- sig := <-sigCh
416
- fmt.Printf("\nReceived signal: %v\n", sig)
417
-
418
- // Cancel context to stop workers
419
- cancel()
420
-
421
- // Wait for graceful shutdown
422
- server.Shutdown(5 * time.Second)
423
- }
424
- ```
425
-
426
- ### Pattern 5: Error Group with Cancellation
427
-
428
- ```go
429
- package main
430
-
431
- import (
432
- "context"
433
- "fmt"
434
- "golang.org/x/sync/errgroup"
435
- "net/http"
436
- )
437
-
438
- func fetchAllURLs(ctx context.Context, urls []string) ([]string, error) {
439
- g, ctx := errgroup.WithContext(ctx)
440
-
441
- results := make([]string, len(urls))
442
-
443
- for i, url := range urls {
444
- i, url := i, url // Capture loop variables
445
-
446
- g.Go(func() error {
447
- req, err := http.NewRequestWithContext(ctx, "GET", url, nil)
448
- if err != nil {
449
- return fmt.Errorf("creating request for %s: %w", url, err)
450
- }
451
-
452
- resp, err := http.DefaultClient.Do(req)
453
- if err != nil {
454
- return fmt.Errorf("fetching %s: %w", url, err)
455
- }
456
- defer resp.Body.Close()
457
-
458
- results[i] = fmt.Sprintf("%s: %d", url, resp.StatusCode)
459
- return nil
460
- })
461
- }
462
-
463
- // Wait for all goroutines to complete or one to fail
464
- if err := g.Wait(); err != nil {
465
- return nil, err // First error cancels all others
466
- }
467
-
468
- return results, nil
469
- }
470
-
471
- // With concurrency limit
472
- func fetchWithLimit(ctx context.Context, urls []string, limit int) ([]string, error) {
473
- g, ctx := errgroup.WithContext(ctx)
474
- g.SetLimit(limit) // Max concurrent goroutines
475
-
476
- results := make([]string, len(urls))
477
- var mu sync.Mutex
478
-
479
- for i, url := range urls {
480
- i, url := i, url
481
-
482
- g.Go(func() error {
483
- result, err := fetchURL(ctx, url)
484
- if err != nil {
485
- return err
486
- }
487
-
488
- mu.Lock()
489
- results[i] = result
490
- mu.Unlock()
491
- return nil
492
- })
493
- }
494
-
495
- if err := g.Wait(); err != nil {
496
- return nil, err
497
- }
498
-
499
- return results, nil
500
- }
501
- ```
502
-
503
- ### Pattern 6: Concurrent Map with sync.Map
504
-
505
- ```go
506
- package main
507
-
508
- import (
509
- "sync"
510
- )
511
-
512
- // For frequent reads, infrequent writes
513
- type Cache struct {
514
- m sync.Map
515
- }
516
-
517
- func (c *Cache) Get(key string) (interface{}, bool) {
518
- return c.m.Load(key)
519
- }
520
-
521
- func (c *Cache) Set(key string, value interface{}) {
522
- c.m.Store(key, value)
523
- }
524
-
525
- func (c *Cache) GetOrSet(key string, value interface{}) (interface{}, bool) {
526
- return c.m.LoadOrStore(key, value)
527
- }
528
-
529
- func (c *Cache) Delete(key string) {
530
- c.m.Delete(key)
531
- }
532
-
533
- // For write-heavy workloads, use sharded map
534
- type ShardedMap struct {
535
- shards []*shard
536
- numShards int
537
- }
538
-
539
- type shard struct {
540
- sync.RWMutex
541
- data map[string]interface{}
542
- }
543
-
544
- func NewShardedMap(numShards int) *ShardedMap {
545
- m := &ShardedMap{
546
- shards: make([]*shard, numShards),
547
- numShards: numShards,
548
- }
549
- for i := range m.shards {
550
- m.shards[i] = &shard{data: make(map[string]interface{})}
551
- }
552
- return m
553
- }
554
-
555
- func (m *ShardedMap) getShard(key string) *shard {
556
- // Simple hash
557
- h := 0
558
- for _, c := range key {
559
- h = 31*h + int(c)
560
- }
561
- return m.shards[h%m.numShards]
562
- }
563
-
564
- func (m *ShardedMap) Get(key string) (interface{}, bool) {
565
- shard := m.getShard(key)
566
- shard.RLock()
567
- defer shard.RUnlock()
568
- v, ok := shard.data[key]
569
- return v, ok
570
- }
571
-
572
- func (m *ShardedMap) Set(key string, value interface{}) {
573
- shard := m.getShard(key)
574
- shard.Lock()
575
- defer shard.Unlock()
576
- shard.data[key] = value
577
- }
578
- ```
579
-
580
- ### Pattern 7: Select with Timeout and Default
581
-
582
- ```go
583
- func selectPatterns() {
584
- ch := make(chan int)
585
-
586
- // Timeout pattern
587
- select {
588
- case v := <-ch:
589
- fmt.Println("Received:", v)
590
- case <-time.After(time.Second):
591
- fmt.Println("Timeout!")
592
- }
593
-
594
- // Non-blocking send/receive
595
- select {
596
- case ch <- 42:
597
- fmt.Println("Sent")
598
- default:
599
- fmt.Println("Channel full, skipping")
600
- }
601
-
602
- // Priority select (check high priority first)
603
- highPriority := make(chan int)
604
- lowPriority := make(chan int)
605
-
606
- for {
607
- select {
608
- case msg := <-highPriority:
609
- fmt.Println("High priority:", msg)
610
- default:
611
- select {
612
- case msg := <-highPriority:
613
- fmt.Println("High priority:", msg)
614
- case msg := <-lowPriority:
615
- fmt.Println("Low priority:", msg)
616
- }
617
- }
618
- }
619
- }
620
- ```
621
-
622
- ## Race Detection
623
-
624
- ```bash
625
- # Run tests with race detector
626
- go test -race ./...
627
-
628
- # Build with race detector
629
- go build -race .
630
-
631
- # Run with race detector
632
- go run -race main.go
633
- ```
634
-
635
- ## Best Practices
636
-
637
- ### Do's
638
- - **Use context** - For cancellation and deadlines
639
- - **Close channels** - From sender side only
640
- - **Use errgroup** - For concurrent operations with errors
641
- - **Buffer channels** - When you know the count
642
- - **Prefer channels** - Over mutexes when possible
643
-
644
- ### Don'ts
645
- - **Don't leak goroutines** - Always have exit path
646
- - **Don't close from receiver** - Causes panic
647
- - **Don't use shared memory** - Unless necessary
648
- - **Don't ignore context cancellation** - Check ctx.Done()
649
- - **Don't use time.Sleep for sync** - Use proper primitives
650
-
651
- ## Resources
652
-
653
- - [Go Concurrency Patterns](https://go.dev/blog/pipelines)
654
- - [Effective Go - Concurrency](https://go.dev/doc/effective_go#concurrency)
655
- - [Go by Example - Goroutines](https://gobyexample.com/goroutines)