摘要:在 Go 语言中,channel(通道)是一种强大的并发原语,用于在不同的 goroutine 之间进行数据传递和同步。以下是 channel 的一些常见使用场景及对应的代码样例。
在 Go 语言中,channel(通道)是一种强大的并发原语,用于在不同的 goroutine 之间进行数据传递和同步。以下是 channel 的一些常见使用场景及对应的代码样例。
在不同的 goroutine 之间传递数据是 channel 最基本的用途。一个 goroutine 可以将数据发送到通道,另一个 goroutine 则可以从通道中接收这些数据。
package mainimport ("fmt")func sender(ch chan int) {for i := 0; ichannel 可以用于实现不同 goroutine 之间的同步。一个 goroutine 可以等待另一个 goroutine 完成某个任务后再继续执行。
package mainimport ("fmt""time")func worker(done chan bool) {fmt.Println("Worker is working...")time.Sleep(time.Second)fmt.Println("Worker is done.")done在高并发场景下,为了避免资源耗尽,需要对并发请求进行限流。可以使用有缓冲的通道来实现限流。
package mainimport ("fmt""time")func processTask(id int, sem chan struct{}) {defer func {sem 是一个有缓冲的通道,缓冲区大小为 3,表示最多允许 3 个任务同时执行。在启动每个任务之前,向通道 sem 发送一个空结构体 struct{}{},如果通道已满,则会阻塞,直到有任务完成并从通道中接收数据。processTask 函数在任务完成后,会从通道 sem 中接收数据,释放一个名额。来源:芬芬课堂