package main /*import ( "fmt" "sync" ) // 工作函数,演示通道作为信号量 func worker(id int, sem chan struct{}, wg *sync.WaitGroup) { defer wg.Done() // 获取信号量 sem <- struct{}{} defer func() { <-sem }() // 释放信号量 fmt.Printf("Worker %d 开始工作\n", id) // 模拟工作 for i := 0; i < 3; i++ { fmt.Printf("Worker %d 工作中...\n", id) } fmt.Printf("Worker %d 完成工作\n", id) } func main() { // 带缓冲通道(容量2) chBuffered := make(chan int, 2) chBuffered <- 1 // 发送不阻塞(未达容量) chBuffered <- 2 fmt.Println(<-chBuffered) // 接收:1 fmt.Println(<-chBuffered) // 接收:2 close(chBuffered) // 关闭后发送会panic,接收返回零值 if v, ok := <-chBuffered; ok { fmt.Println(v) } else { fmt.Println("通道已关闭") // 输出此句 } // 无缓冲通道(发送/接收需同时就绪) chUnbuffered := make(chan string) go func() { chUnbuffered <- "hello from goroutine" // 发送方:等待接收 }() msg := <-chUnbuffered // 接收方:等待发送 fmt.Println(msg) // 输出:hello from goroutine close(chUnbuffered) // 通道实现信号量(限制并发数) var wg sync.WaitGroup sem := make(chan struct{}, 2) // 并发数限制为2 for i := 1; i <= 5; i++ { wg.Add(1) go worker(i, sem, &wg) } wg.Wait() close(sem) fmt.Println("所有工作完成") } */