1 回答

TA貢獻(xiàn)1934條經(jīng)驗(yàn) 獲得超2個(gè)贊
這里,在 Go Playground 中,是經(jīng)過一些細(xì)微修改的原始代碼:
延遲減少,除了
time.Sleep(5)
變?yōu)?code>time.Sleep(time.Second);a
return
被刪除,因?yàn)樗兊貌槐匾?/p>a
fmt.Println
被注釋掉,因?yàn)?thereturn
和未注釋的fmt.Println
都會(huì)go vet
抱怨無法訪問fmt.Println
;存儲(chǔ)的通道
errChang
更改為無緩沖。
運(yùn)行時(shí),其輸出為:
1 hola 2
(在 之前有一個(gè)小的延遲2
),表明您在 function 中啟動(dòng)的匿名 goroutine 確實(shí)leaking
仍在運(yùn)行。
如果我們?nèi)∠⑨尩舻淖⑨?code>fmt.Println,則輸出為:
1 hola 6 1
(在final之前有同樣的輕微延遲1
)因?yàn)槲覀儸F(xiàn)在等待(然后打印)在return666
channel中計(jì)算并發(fā)送的值errChang
。
如果我們保留注釋掉的注釋fmt.Println
并使通道緩沖,則輸出將變?yōu)椋?/p>
1 hola 1
因?yàn)槟涿?goroutine 現(xiàn)在能夠?qū)⑵渲?(6) 推送到通道中。
通道本身以及存儲(chǔ)在其中的單個(gè)值將被垃圾收集,因?yàn)榇藭r(shí)沒有對(duì)該通道的剩余引用。但請(qǐng)注意,僅僅使通道緩沖并不總是足夠的。如果我們沿著通道發(fā)送兩個(gè)值,程序?qū)⒎祷卮蛴。?/p>
1 hola 2
因?yàn)槟涿?goroutine 成功放入6
通道,但隨后也阻止了嘗試放入42
。
- 1 回答
- 0 關(guān)注
- 158 瀏覽
添加回答
舉報(bào)