20.channel有緩衝和無緩衝同步問題
阿新 • • 發佈:2021-10-09
1.有緩衝
示例程式碼
package chapter15 import ( "fmt" "time" ) func RunChannel02() { c := make(chan int, 3) // 帶有緩衝的channel fmt.Println("len(c) = ", len(c), ", cap(c) = ", cap(c)) go func() { defer fmt.Println("子go程結束") for i := 0; i < 4; i++ { c <- i fmt.Println("子go程正在執行,傳送的元素=", i, "len(c) = ", len(c), ", cap(c) = ", cap(c)) } }() time.Sleep(2 * time.Second) for i := 0; i < 4; i++ { num := <-c //從c中接收資料,並賦值給num fmt.Println("num = ", num) } fmt.Println("main 結束") } // 執行結果 len(c) = 0 , cap(c) = 3 子go程正在執行,傳送的元素= 0 len(c) = 0 , cap(c) = 3 子go程正在執行,傳送的元素= 1 len(c) = 1 , cap(c) = 3 子go程正在執行,傳送的元素= 2 len(c) = 2 , cap(c) = 3 子go程正在執行,傳送的元素= 3 len(c) = 3 , cap(c) = 3 子go程結束 num = 0 num = 1 num = 2 num = 3 main 結束
可能出現的執行結果現象