在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) }
为什么要用管道呢?那是因为当管道中读取不到数据的时候,协程它会自动进入休眠,当有数据进来他才会被唤醒,不会一直占用内存,不像共用内存那样会一直阻塞导致占用内存。并且他们能做到同样的效果,而效率却不一样。