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 ...