Go語言中的匿名goroutine


為了理解**匿名goroutine**,我們必須瞭解匿名函式和**goroutine**的存在。我們將首先探索匿名函式,這是**匿名goroutine**動機的真正原因,然後我們將學習一些關於**goroutine**是什麼的知識,最後檢查幾個**匿名goroutine**的例子。

匿名函式

在Go語言中,匿名函式是沒有名稱的函式。簡單地說,匿名函式在宣告時不使用任何變數作為名稱。

我們知道,我們使用如下所示的類似語法宣告一個函式。

func Sample(){
   // some code
}

雖然我們上面這個函式有名稱**(Sample)**,但在匿名函式的情況下,我們沒有名稱。

示例 1

下面是一個非常簡單的匿名函式示例。

package main
import (
   "fmt"
)
func main() {
   func(name string) {
      fmt.Println("Welcome to", name)
   }("TutorialsPoint")
}

在上面的程式碼中,我們在我們Go程式的main函式內有一個匿名函式。這個匿名函式接受一個引數,並且在函式程式碼塊結束時立即傳遞引數。

輸出

如果我們使用命令**go run main.go**執行此程式碼,我們將看到以下輸出列印在終端中。

Welcome to TutorialsPoint

Go語言中的goroutine

**goroutine**是由Go執行時管理的極其輕量級的執行緒。使用**goroutine**,我們可以編寫非同步並行程式,這些程式可以比順序程式更快地執行某些任務。

Goroutine幫助我們使程式具有非同步特性,並讓我們在更短的時間內和更少的資源下完成更多工作。

因此,**匿名goroutine**背後的思想是,它只是一個在呼叫它的**goroutine**之外的單獨**goroutine**上執行的匿名函式。

示例 2

讓我們來看一個非常基本的**匿名goroutine**示例,以便更好地理解它。

package main
import (
   "fmt"
   "time"
)
func main() {
   fmt.Println("before the anonymous goroutine")
   go func(name string) {
      fmt.Println("Welcome to", name)
   }("TutorialsPoint")
   time.Sleep(time.Second)
   fmt.Println("after the anonymous goroutine")
}

在上面的例子中,我們使用了一個**匿名goroutine**,為了確保main函式在goroutine完成其工作之前不結束,我們還編寫了一個**time.Sleep()**函式,該函式將第二個**fmt.Println()**延遲1秒。

輸出

如果我們使用go run main.go命令執行上面的程式碼,我們將看到以下輸出。

before the anonymous goroutine
Welcome to TutorialsPoint
after the anonymous goroutine

除了編寫**time.Sleep()**函式外,我們還可以使用任何阻塞**main goroutine**的函式,這將給**main**函式中的**匿名goroutine**足夠的時間來正確執行。

示例 3

考慮以下程式碼。

package main
import (
   "fmt"
)
func main() {
   func(name string) {
      fmt.Println("Welcome to", name)
   }("TutorialsPoint")
   fmt.Scanln() // blocking call
}

輸出

如果我們使用**go run main.go**命令執行上面的程式碼,我們將看到以下輸出。

Welcome to TutorialsPoint
...

更新於:2022年2月22日

4K+ 次瀏覽

啟動你的職業生涯

透過完成課程獲得認證

開始學習
廣告