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