go channel 适用哪些场景?帮忙写几个实战应用的demo
o 的通道(channel)是用来在 Go 程序中不同 goroutine 之间进行同步和通信的一种机制。它可以用来在 goroutine 之间传递数据,也可以用来在不同的 goroutine 之间同步执行。
下面是几个使用 Go 通道的实战应用的例子:
在多个 goroutine 之间传递数据:
package main
import "fmt"
func main() {
// 创建一个字符串类型的通道
stringChannel := make(chan string)
// 启动一个 goroutine,将字符串 "Hello, World!" 写入通道
go func() {
stringChannel <- "Hello, World!"
}()
// 从通道中读取字符串
message := <-stringChannel
fmt.Println(message)
}
使用通道实现线程同步:
package main
import "fmt"
func main() {
// 创建一个布尔类型的通道
done := make(chan bool)
// 启动一个 goroutine
go func() {
// 在 goroutine 中执行一些操作
fmt.Println("Doing some work...")
// 向通道写入 true
done <- true
}()
// 从通道中读取布尔值,等待 goroutine 执行完毕
<-done
fmt.Println("Done!")
}
使用通道实现并发限制:
package main
import (
"fmt"
"sync"
)
func main() {
// 创建一个长度为 5 的通道,表示同时只能有 5 个 goroutine 并发执行
semaphore := make(chan bool, 5)
var wg sync.WaitGroup
wg.Add(20)
for i := 0; i < 20; i++ {
go func(n int) {
// 向