1. 程式人生 > 其它 >20.channel有緩衝和無緩衝同步問題

20.channel有緩衝和無緩衝同步問題

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 結束

可能出現的執行結果現象

2.總結