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)」剛好是相反的意思:一件事做完才輪到下一件。