在golang中,我们推荐用管道进行协程间的通信而不是用共享内存,什么叫用共享内存进行协程间的通信呢?看下列代码
func do(b *int) {
for true {
if *b == 1 {
fmt.Println("hello")
break
}
}
}
func main() {
b := 0
go do(&b)
time.Sleep(time.Second)
b = 1
time.Sleep(time.Second)
}
上述代码就是通过共享内存进行协程间的通信。而下述代码就是通过管道进行协程间的通信
func do(b chan int) {
if <-b == 1 {
fmt.Println("hello")
}
}
func main() {
b := make(chan int)
go do(b)
time.Sleep(time.Second)
b <- 1
time.Sleep(time.Second)
}
为什么要用管道呢?那是因为当管道中读取不到数据的时候,协程它会自动进入休眠,当有数据进来他才会被唤醒,不会一直占用内存,不像共用内存那样会一直阻塞导致占用内存。并且他们能做到同样的效果,而效率却不一样。