https://play.golang.org/p/FMKxtVlTL5為什么default:select語句中的程序會無限循環?package mainimport ( "fmt" "strconv" "time")var quit chan boolvar counter chan intfunc main() { counter = make(chan int) quit = make(chan bool) go func() { i := 0 for { i++ select { case <-quit: fmt.Println("Bye!") return case counter <- i: fmt.Println("Send! " + strconv.Itoa(i)) default: fmt.Println("Default! " + strconv.Itoa(i)) } } }() fmt.Println("Receive! " + strconv.Itoa(<-counter)) fmt.Println("Receive! " + strconv.Itoa(<-counter)) fmt.Println("Receive! " + strconv.Itoa(<-counter)) fmt.Println("Receive! " + strconv.Itoa(<-counter)) fmt.Println("Receive! " + strconv.Itoa(<-counter)) fmt.Println("Receive! " + strconv.Itoa(<-counter)) quit <- true time.Sleep(1 * time.Second)}
1 回答

隔江千里
TA貢獻1906條經驗 獲得超10個贊
當 aselect
有 adefault
時,它變成非阻塞的。引用規范:
如果一個或多個通信可以進行,則通過統一的偽隨機選擇選擇一個可以進行的通信。否則,如果存在默認情況,則選擇該情況。如果沒有默認情況,“select”語句會阻塞,直到至少有一個通信可以繼續。
如果沒有default
, theselect
將等到它可以從 接收quit
或發送counter
,然后執行此操作,然后繼續(再次通過for
循環,除非它運行該return
)。默認情況下,從不等待任何事情,并且每次可以運行時都會簡單地運行,除非其他操作之一通過。select
default
理論上程序還是一樣的,在第六次打印“Send!”后退出。和“接收!” — 但它可能太忙于打印“默認!” 數十億次才能在合理的時間內到達那里。
- 1 回答
- 0 關注
- 165 瀏覽
添加回答
舉報
0/150
提交
取消