在Go語言中,可以使用goroutine來實現多線程的并發執行。goroutine是Go語言中輕量級的線程,可以在一個程序中創建很多個goroutine,并且它們之間的切換和調度是由Go語言的運行時自動完成的。
要創建一個新的goroutine,只需要在函數或方法調用前加上關鍵字go即可。例如:
package main
import (
"fmt"
"time"
)
func main() {
// 創建一個新的goroutine
go printNumbers()
// 主goroutine繼續執行其他任務
for i := 0; i < 5; i++ {
fmt.Println("Main goroutine:", i)
time.Sleep(time.Second)
}
}
func printNumbers() {
for i := 0; i < 5; i++ {
fmt.Println("New goroutine:", i)
time.Sleep(time.Second)
}
}
在上面的例子中,我們使用go printNumbers()
創建了一個新的goroutine來執行printNumbers
函數。主goroutine繼續執行for
循環中的任務,而新的goroutine會并發地執行printNumbers
函數中的任務。
需要注意的是,主goroutine在結束之前不會等待其他goroutine的完成,所以在上面的例子中,主goroutine和新的goroutine會并發地執行,打印出來的數字是交替出現的。
此外,還可以使用sync.WaitGroup
來等待所有的goroutine都執行完畢。例如:
package main
import (
"fmt"
"sync"
"time"
)
func main() {
var wg sync.WaitGroup
// 創建兩個新的goroutine
wg.Add(2)
go printNumbers(&wg)
go printLetters(&wg)
// 等待所有的goroutine執行完畢
wg.Wait()
}
func printNumbers(wg *sync.WaitGroup) {
defer wg.Done()
for i := 0; i < 5; i++ {
fmt.Println("Numbers:", i)
time.Sleep(time.Second)
}
}
func printLetters(wg *sync.WaitGroup) {
defer wg.Done()
for i := 'A'; i < 'E'; i++ {
fmt.Println("Letters:", string(i))
time.Sleep(time.Second)
}
}
在上面的例子中,我們使用sync.WaitGroup
來等待所有的goroutine執行完畢。首先在main
函數中創建了一個WaitGroup
實例,并且調用了Add
方法來指定需要等待的goroutine的數量。然后在每個goroutine的函數中,都調用了wg.Done()
來表示當前goroutine執行完畢。最后,在main
函數中調用wg.Wait()
來等待所有的goroutine完成。
通過以上兩種方式,就可以在Go語言中開啟多個goroutine來實現多線程的并發執行。