如何解决大小为 1 的缓冲通道可以保证延迟发送一次吗?
如前所述here: 大小为 1 的缓冲通道可以为您提供一次延迟发送保证
在下面的代码中:
package main
import (
"fmt"
"time"
)
func display(ch chan int) {
time.Sleep(5 * time.Second)
fmt.Println(<-ch) // Receiving data
}
func main() {
ch := make(chan int,1) // Buffered channel - Send happens before receive
go display(ch)
fmt.Printf("Current Unix Time: %v\n",time.Now().Unix())
ch <- 1 // Sending data
fmt.Printf("Data sent at: %v\n",time.Now().Unix())
}
输出:
Current Unix Time: 1610599724
Data sent at: 1610599724
如果不显示上面代码中的数据,大小为1的缓冲通道是否保证数据的接收?
如何验证,如果 display()
收到数据?
解决方法
你能保证接收 goroutine 收到数据的唯一方法是告诉调用者它确实收到了:
func display(ch chan int,done chan struct{}) {
time.Sleep(5 * time.Second)
fmt.Println(<-ch) // Receiving data
close(done)
}
func main() {
ch := make(chan int,1) // Buffered channel - Send happens before receive
done:=make(chan struct{})
go display(ch,done)
fmt.Printf("Current Unix Time: %v\n",time.Now().Unix())
ch <- 1 // Sending data
fmt.Printf("Data sent at: %v\n",time.Now().Unix())
<-done
// received data
}
您也可以将 sync.WaitGroup
用于相同目的。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。