golang中 channel被关闭了处于sendq中的goroutine会怎么样
当一个channel被关闭时,处于sendq中的goroutine会继续执行直到完成发送操作或者被其他因素阻塞。在完成发送操作后,它将从sendq中移除并继续执行后续的代码。如果一个goroutine在sendq中等待,但是channel已经关闭,它会收到一个零值(zero value)并且在继续执行前返回。
下面是一个示例代码,演示了关闭channel后处于sendq中的goroutine的行为:
package main
import (
"fmt"
)
func main() {
ch := make(chan int)
go func() {
ch <- 1
ch <- 2
ch <- 3
}()
go func() {
for {
val, ok := <-ch
if !ok {
// channel 已关闭
fmt.Println("Channel closed")
break
}
fmt.Println("Received:", val)
}
}()
// 等待goroutine执行完毕
fmt.Scanln()
close(ch)
fmt.Scanln()
}
在上面的示例中,我们创建了一个channel ch 并启动了两个goroutine。第一个goroutine会向channel发送三个值1、2、3。第二个goroutine会从channel接收值并打印出来。在主goroutine中,我们等待用户输入后关闭channel。
运行这段代码后,我们会看到第一个goroutine在执行发送操作时被阻塞,直到channel被关闭。一旦channel被关闭,第一个goroutine会继续执行并打印出"Channel closed"。同时,第二个goroutine会接收到关闭的channel,并在打印完最后一个值后退出。
总结:在关闭channel后,处于sendq中的goroutine会继续执行直到完成发送操作或者被其他因素阻塞
原文地址: https://www.cveoy.top/t/topic/iqaY 著作权归作者所有。请勿转载和采集!