我改編了以下示例,說明了由于從 nil 通道接收而導致的 goroutine 泄漏:package mainimport (? ? "flag"? ? "fmt"? ? "runtime"? ? "time")var initChannel boolfunc main() {? ? flag.Parse()? ? var ch chan int? ? if initChannel {? ? ? ? ch = make(chan int, 1)? ? ? ? ch <- 1? ? }? ? go func(ch chan int) {? ? ? ? <-ch? ? }(ch)? ? c := time.Tick(1 * time.Second)? ? for range c {? ? ? ? fmt.Printf("#goroutines: %d\n", runtime.NumGoroutine())? ? }}func init() {? ? flag.BoolVar(&initChannel, "init", false, "initialize channel")}我注意到如果我用 運行它initChannel false,goroutine 的數量是 2:> go run main.go#goroutines: 2#goroutines: 2而如果我用 運行它true,數字是 1:> go run main.go --init#goroutines: 1#goroutines: 1然而,我不太明白為什么會出現這種情況。我只看到一個go語句,所以我希望在任何一種情況下都只有一個 goroutine。為什么從 nil 通道讀取時有兩個 goroutine?
1 回答

慕俠2389804
TA貢獻1719條經驗 獲得超6個贊
當你的應用程序啟動時,已經有一個 goroutine 運行該main()
函數。
如果不初始化ch
通道,它將保持通道的零值nil
。規格: 接收運算符:
從
nil
通道接收永遠阻塞。
因此,如果通道為nil
,則啟動的 goroutine 將永遠不會結束。所以你將有 2 個 goroutine:本身的main
goroutine 和你啟動的 goroutine。
如果你用 1 個緩沖區初始化通道并在其上發送一個值,那么你也會在“一小段時間”內擁有 2 個 goroutine,但啟動的 goroutine 可以從中接收一個值,然后立即結束。所以只剩下一個 goroutine,即main
goroutine。
- 1 回答
- 0 關注
- 137 瀏覽
添加回答
舉報
0/150
提交
取消