Loading... 在Go语言中,channel是一种用于在goroutine之间进行通信和同步的机制。它可以被看作是一个类型安全的队列,用于在发送和接收操作之间传递数据。 Buffered channel(缓冲通道)是一种具有固定容量的channel。它允许在发送操作之后,接收操作之前,将多个值存储在channel中。当channel已满时,发送操作将被阻塞,直到有空间可用。类似地,当channel为空时,接收操作将被阻塞,直到有值可用。 以下是创建和使用缓冲通道的示例: ```go // 创建一个容量为3的缓冲通道 ch := make(chan int, 3) // 发送值到通道 ch <- 1 ch <- 2 ch <- 3 // 从通道接收值 fmt.Println(<-ch) fmt.Println(<-ch) fmt.Println(<-ch) ``` 打印结果将是: ```bash 1 2 3 ``` 非缓冲通道(也称为同步通道)没有容量限制。发送操作将阻塞,直到有接收操作准备好接收该值。类似地,接收操作将阻塞,直到有发送操作准备好发送值。 以下是创建和使用非缓冲通道的示例: ```go // 创建一个非缓冲通道 ch := make(chan int) // 在一个goroutine中发送值到通道 go func() { ch <- 1 fmt.Println("发送完成") }() // 在主goroutine中接收值 fmt.Println(<-ch) fmt.Println("接收完成") ``` 需要注意的是,非缓冲通道的发送和接收操作将会导致发送方和接收方在同一个时间点上进行阻塞,直到两者都准备好进行通信。这种同步机制可以确保goroutine之间的顺序执行和数据的可靠传递。 打印结果将是: ```bash 发送完成 1 接收完成 ``` 在非缓冲通道的示例中,发送操作和接收操作是同步的。发送操作在接收操作准备好之前被阻塞,因此先打印出"发送完成"。接收操作在发送操作完成之后才能继续执行,因此打印出接收到的值"1",然后打印出"接收完成"。 最后修改:2023 年 07 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏