golang 并发问题
在Go语言中,通道(channel)是用来在协程(goroutine)之间安全地传递数据的机制。当一个通道被关闭后,仍然可以从通道中接收值,直到通道中的所有值都被成功接收。一旦通道中没有值,并且通道被关闭,尝试从该通道接收数据将返回零值,并且不会阻塞(对于基本类型是0或nil,对于引用类型是nil),并且不会阻塞。
package main
import (
"fmt"
)
func main() {
ch := make(chan int, 2) // 创建一个容量为2的int类型通道
ch <- 10
ch <- 20
close(ch) // 关闭通道
// 接收通道中的值
fmt.Println(<-ch) // 输出: 10
fmt.Println(<-ch) // 输出: 20
fmt.Println(<-ch) // 输出: 0,因为没有更多的值,通道已关闭
}
如果不确定通道是否关闭可使用下面的进行检查
value, ok := <-ch
if !ok {
// 通道已关闭或为空,并且没有更多的值可以接收
fmt.Println("Channel is closed or empty")
} else {
fmt.Println(value)
}
本作品采用《CC 协议》,转载必须注明作者和本文链接