在 Go 语言中,通道(Channel)是一种用于在 goroutine 之间进行通信和同步的机制。通道提供了一种安全、简单、高效的方式来共享数据,避免了显式的锁和条件变量。
go中channel的应用场景:
- 消息传递、消息过滤
- 信号广播
- 事件订阅和广播
- 任务分支
- 结果汇总
- 并发控制
- 同步和异步
1、channel的有无缓冲通道
package main
import (
"fmt"
"time"
)
// 不要通过共享内存来通信,而要通过通信来共享内存
func main() {
var msg chan string
msg = make(chan string, 0) //如果为0,会导致dead lock
//msg= make(chan string,0)//无缓冲通道
//msg= make(chan string,10)//有缓冲通道
//无缓冲channel适用于通知,B要第一时间通知 知道A是否已经完成
//有缓冲channel适用于消费者和生产者之间的通信
go func(msg chan string) {
data := <-msg
fmt.Println(data)
}(msg)
msg <- "string"
time.Sleep(time.Second * 3)
}
2 、channel的打印方式,for…range…和ok…idiom…
package main
import (
"fmt"
"time"
)
func main() {
ch := make(chan int, 3)
go func() {
for i := 1; i <= 3; i++ {
ch <- i
time.Sleep(time.Second)
}
close(ch)
}()
// 使用ok idiom遍历通道
for {
num, ok := <-ch
if !ok {
break
}
fmt.Println(num)
}
// 使用for range遍历通道
for num := range ch {
fmt.Println(num)
}
fmt.Println("Channel closed, exiting...")
}
运行结果