作者 主題: [Golang] select-case  (閱讀 919 次)

0 會員 與 1 訪客 正在閱讀本文。

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
[Golang] select-case
« 於: 2015-09-06 15:41 »
select case 每次都會隨機選擇一個已進入『備妥』狀態的 case 來執行
而且每一輪進入 select 時,每一個 case 被選中的機率都一樣
不會輪流選擇,完全是隨機。

下面範例是網路上抓來修改的
每個 case 增加一個計數器
最後將進入每個 case 的次數印出

從執行結果可以看到,每次進入 select
每一個 case 後的函數都會被呼叫一次
但是最後只會隨機選擇一個 case 進入

Code:
代碼: [選擇]
package main

import (
  "fmt"
)

func main() {
  ch1 := make(chan bool, 1)
  c1, c2, c3, c4, c5 := 0, 0, 0, 0, 0

  func() {
    defer func() {
      fmt.Println(c1, c2, c3, c4, c5)
    }()

    for {
      fmt.Println("start")
      select {
      case ch1 <- callMe("c1"):
        c1++
        fmt.Println("in case1")
      case ch1 <- callMe("c2"):
        c2++
        fmt.Println("in case2")
      case ch1 <- callMe("c3"):
        c3++
        fmt.Println("in case3")
      case ch1 <- callMe("c4"):
        c4++
        fmt.Println("in case4")
      case ch1 <- callMe("c5"):
        c5++
        fmt.Println("in case5")
      }
      fmt.Println("end")
      <-ch1
      if c1+c2+c3+c4+c5 >= 100 {
        return
      }
    }
  }()
}

func callMe(s string) bool {
  fmt.Println("in", s)
  return true
}

每次跑完的結果都會不同,下面列出跑3次的結果

Result:
引用
23 18 17 30 12
21 18 18 24 19
26 11 20 25 18

http://play.golang.org/p/ky75RbvoEz