[golang] go func

在 Golang 中,go func 用於啟動 Goroutine,也就是 Go 語言提供的輕量級並發執行單元。這允許我們讓某些函式在 背景執行 (非同步),而不會阻塞主程式。



go func 的基本語法

gofunc() {
fmt.Println("Hello from Goroutine!") }()

這段程式碼會建立一個 Goroutine,並執行匿名函式。

完整範例:

package main

import ( "fmt""time" ) funcmain() { gofunc() { fmt.Println("Hello from Goroutine!") }() time.Sleep(time.Second) // 給 Goroutine 時間執行 fmt.Println("Main function done") }

輸出:

Hello from Goroutine!
Main functiondone

但 Goroutine 是 非同步執行,如果 main 函式結束得太快,Goroutine 可能來不及執行。



go func 搭配參數

你可以在 go func 中傳遞參數:

gofunc(name string) {
fmt.Println("Hello,", name) }("Alice")

或者用變數來傳遞:

name := "Alice"
gofunc(n string) { fmt.Println("Hello,", n) }(name)

⚠ 注意:Goroutine 可能會發生 變數閉包 (Closure Issue),請確保變數的值在 Goroutine 執行時不會變動。




go func 常見問題


Goroutine 太快結束,導致程式沒執行?

解法:使用 sync.WaitGroup 來確保 Goroutine 執行完畢:

package main

import ( "fmt""sync" ) funcmain() { var wg sync.WaitGroup wg.Add(1) // 設定等待 1 個 Goroutinegofunc() { defer wg.Done() // 任務完成時標記 fmt.Println("Hello from Goroutine!") }() wg.Wait() // 等待 Goroutine 結束 fmt.Println("Main function done") }


如何讓多個 go func 併發執行?

解法:使用 sync.WaitGroup 來等待多個 Goroutine 完成:

package main

import ( "fmt""sync" ) funcmain() { var wg sync.WaitGroup for i := 1; i <= 3; i++ { wg.Add(1) gofunc(n int) { defer wg.Done() fmt.Println("Goroutine", n, "is running") }(i) // 傳遞 `i`,避免閉包問題 } wg.Wait() fmt.Println("All Goroutines Done") }

輸出

Goroutine 1 is running

Goroutine 2 is running

Goroutine 3 is running 

All Goroutines Done



留言

這個網誌中的熱門文章

[Kotlin]如何學習Kotlin

[golang]如何使用 gorm 高效執行批量插入 (可以透過 Create()、CreateInBatches(),或者 原生 SQL 語句 來提升效率)

[Kotlin]Kotlin Multiplatform (KMP) 如何安裝使用和部署