← Back to list

go-channel-patterns
by JamesPrial
WIP - collection of various Claude stuff i make/use/have_Claude_hallucinate
⭐ 2🍴 0📅 Jan 23, 2026
SKILL.md
name: go-channel-patterns description: Common channel patterns and idioms
Channel Patterns
Core Rule
Only the sender closes channels. Receivers never close.
CORRECT - Sender closes
func generator() <-chan int {
ch := make(chan int)
go func() {
defer close(ch) // Sender closes
for i := 0; i < 10; i++ {
ch <- i
}
}()
return ch
}
func main() {
for num := range generator() {
fmt.Println(num)
}
}
WRONG - Receiver closes
func main() {
ch := make(chan int)
go func() {
for i := 0; i < 10; i++ {
ch <- i // Panic: send on closed channel
}
}()
for i := 0; i < 5; i++ {
<-ch
}
close(ch) // WRONG: receiver closes
}
Pattern: Fan-Out (Multiple Workers)
func fanOut(input <-chan int, workers int) []<-chan int {
outputs := make([]<-chan int, workers)
for i := 0; i < workers; i++ {
outputs[i] = worker(input)
}
return outputs
}
func worker(input <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for n := range input {
out <- n * 2
}
}()
return out
}
Pattern: Fan-In (Merge Channels)
func fanIn(channels ...<-chan int) <-chan int {
out := make(chan int)
var wg sync.WaitGroup
wg.Add(len(channels))
for _, ch := range channels {
go func(c <-chan int) {
defer wg.Done()
for n := range c {
out <- n
}
}(ch)
}
go func() {
wg.Wait()
close(out)
}()
return out
}
Pattern: Or-Done (Early Exit)
func orDone(ctx context.Context, ch <-chan int) <-chan int {
out := make(chan int)
go func() {
defer close(out)
for {
select {
case <-ctx.Done():
return
case v, ok := <-ch:
if !ok {
return
}
select {
case out <- v:
case <-ctx.Done():
return
}
}
}
}()
return out
}
Rules
- Use directional channels:
<-chan(receive),chan<-(send) - Unbuffered for synchronization, buffered for non-blocking
- Check
okwhen not usingrange:v, ok := <-ch - Close to signal "no more values", not to stop receivers
- Nil channels block forever (useful in
select)
Buffered vs Unbuffered
// Unbuffered: synchronous handoff
ch := make(chan int)
// Buffered: decouples sender/receiver
ch := make(chan int, 10)
Score
Total Score
65/100
Based on repository quality metrics
✓SKILL.md
SKILL.mdファイルが含まれている
+20
✓LICENSE
ライセンスが設定されている
+10
○説明文
100文字以上の説明がある
0/10
○人気
GitHub Stars 100以上
0/15
✓最近の活動
1ヶ月以内に更新
+10
○フォーク
10回以上フォークされている
0/5
✓Issue管理
オープンIssueが50未満
+5
✓言語
プログラミング言語が設定されている
+5
✓タグ
1つ以上のタグが設定されている
+5
Reviews
💬
Reviews coming soon
