Goroutine 是用 go 關鍵字啟動的輕量任務

在任何函式呼叫前面加 go,那個呼叫就丟到另一條 goroutine 去跑,go 這行本身立刻回傳、不等它做完。

func main() {
    go say("world")   // 另一條 goroutine
    say("hello")      // main 自己這條
}

goroutine 由 Go runtime 排程(不是作業系統執行緒),起始 stack 只有幾 KB 且可增長,所以開幾千條是正常的用法——這是它跟 thread 的關鍵差別。

main 結束 = 整個程式結束

goroutine 不會讓程式活著等它:main 回傳的當下,所有還在跑的 goroutine 一起被砍。

func main() {
    go sayHello()   // 什麼都不會印出來
}

所以任何啟動 goroutine 的程式都必須有「等它」的機制,見 用 time.Sleep 等 goroutine 只是 demo 寫法

交錯輸出證明的是並行,不是同步

world
hello
hello
world
...

兩邊的輸出交錯代表它們同時在推進(concurrent)——「同步(synchronous)」剛好是相反的意思:一件事做完才輪到下一件。

相關:Channel 是 goroutine 之間的通訊管道