/go@mmis_js_bot package main
import (
"fmt"
"strconv"
)
func main() {
// 建立「完成」頻道,容量能夠容納所有迴圈的訊息。
done := make(chan bool, 100*100)
// 建立「全部都已完成」頻道。
allDone := make(chan bool)
// 將迴圈丟到另一個行程執行。
go func() {
// 第一層 Goroutine 迴圈。
for i := 0; i < 100; i++ {
go func(i int) {
// 輸出層數。
fmt.Println(i)
// 將迴圈丟到另一個行程執行。
go func(i int) {
// 第二層 Goroutine
for j := 0; i < 100; i++ {
// 輸出層數。
go func(i, j int) {
fmt.Println(strconv.Itoa(i) + "." + strconv.Itoa(j))
}(i, j)
// 如果是最後的迴圈則發送完成資訊。
if j == 100 {
// 向「完成」頻道發送資訊。
done <- true
}
}
}(i)
}(i)
}
}()
// 用來偵測所有迴圈是否結束的迴圈。
go func(done chan bool) {
// 無限執行的迴圈,不斷地偵測頻道是否已滿。
for {
// 如果完成頻道全滿,就表示所有迴圈都已經完成了。
if len(done) == cap(done) {
allDone <- true
}
}
}(done)
// 除非「完成」頻道接收到任何訊息,否則卡在這裡。
<-done
fmt.Println("All done!")
}