在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)
}

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