Files
bulma/composite_chan.go
T

62 lines
1.4 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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("所有工作完成")
}
*/