域名不转出可以做网站吗,asp科技公司网站源码,wordpress没有上级目录的写权限,如何制作一个小程序无缓冲的channel
channel的默认类型就是无缓冲的。当一个数据被发送到无缓冲的channel中#xff0c;发送操作会被阻塞#xff0c;知道有另一个goroutine从这个channel中接收这个数据。同样#xff0c;当试图从一个无缓冲的channel中接收数据时#xff0c;如果没有数据可以…无缓冲的channel
channel的默认类型就是无缓冲的。当一个数据被发送到无缓冲的channel中发送操作会被阻塞知道有另一个goroutine从这个channel中接收这个数据。同样当试图从一个无缓冲的channel中接收数据时如果没有数据可以接收接收操作也会被阻塞直到有另一个goroutine发送数据到这个channel。因此无缓冲的channel提高了一种强同步的通信机制发送和接收操作在完成数据交换的时候都会阻塞确保了数据在不同的goroutine之间精确同步。
有缓冲的channel
有缓冲的channel具有一个固定大小的缓冲区。当数据被发送到有缓冲的channel时如果缓冲区未满发送操作就会立刻返回否则发送操作会阻塞直到有另一个goroutine从channel中接收数据病空出空间。当从一个有缓冲的channel接收数据的时候如果缓冲区有数据接收操作会被立刻返回否则接收操作会阻塞直到有另一个goroutine发送数据到channel。因此有缓冲的channel提供了一种弱同步的通信机制发送和接收操作可能不会阻塞是的goroutine可以继续执行其他的操作。
使用场景
无缓冲的channel 适用于确保两个goroutine必须同步进行的场景比如确保某个事件发生后才进行下一步操作。有缓冲的channel 适用于想要减少因等待而导致的阻塞的场景或者当数据生产速度不定时缓冲可以帮助平滑数据流动和处理。
以下是一个使用示例无缓冲的情况下发送操作会阻塞因此打印操作也无法执行直到接收操作完成而有缓冲的情况下发送操作不会阻塞所以会继续向下执行打印操作。
package mainimport (fmttime
)func main() {// 无缓冲的channelunbuffered : make(chan string)go func() {unbuffered - Hello, World!fmt.Println(Sent message to unbuffered channel!)}()// 模拟处理延迟time.Sleep(3 * time.Second)fmt.Println(-unbuffered)// 有缓冲的channelbuffered : make(chan string, 1)go func() {buffered - Hello, World!fmt.Println(Sent message to buffered channel!)}()// 模拟处理延迟time.Sleep(3 * time.Second)fmt.Println(-buffered)
}最后给大家推荐一个LinuxC/C高级架构系统教程的学习资源与课程可以帮助你有方向、更细致地学习C/C后端开发具体内容请见 https://xxetb.xetslk.com/s/1o04uB