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+ 次浏览

启动你的职业生涯

通过完成课程获得认证

开始学习
广告