golang遍歷channel時return問題

lightTrace發表於2019-01-15

今天我在遍歷channel裡的資料的時候加入了業務程式碼,業務程式碼裡有return,一但return之後遍歷就停止了,例如:

package main
import (
   "fmt"
   "sync"
   "time"
)
func consumer(cname string, ch chan int) {
   //可以迴圈 for i := range ch 來不斷從 channel 接收值,直到它被關閉。
   for i := range ch {
      time.Sleep(1*time.Second)
      if i>20{
         return
      }
      fmt.Println("consumer-----------", cname, ":", i)
   }
   fmt.Println("ch closed.")
}

func producer(pname string, ch chan int) {
   for i := 0; i < 1000; i++ {
      //time.Sleep(1*time.Second)
      fmt.Println("producer--", pname, ":", i)
      ch <- i
   }
}


func main() {
   //用channel來傳遞"產品", 不再需要自己去加鎖維護一個全域性的阻塞佇列
   ch := make(chan int,500)
   go producer("生產者", ch)
   for i:=0;i<5;i++  {
     go consumer("消費者", ch)
   }
   time.Sleep(1000 * time.Second)
   close(ch)
   time.Sleep(10 * time.Second)
}

i一旦大於20,從管道不斷消費資料就停止了,所以遍歷channel的時候不要放業務程式碼最好,放了是萬萬不能return的,當然panic同樣也是不允許的。

相關文章