go routine 初探 | 青训营笔记

54 阅读1分钟

当前goroutine评估在新goroutine中执行的函数/方法的输入参数。甚至我们的main()函数也是一个goroutine,它由Go运行时管理的隐式创建的goroutine调用。

package main
import "fmt"

func WelcomeMessage(){
    fmt.Println("Welcome to Educative!")
}

func main() {
  go WelcomeMessage()
  fmt.Println("Hello World!")
}

回想一下,主函数也是一种goroutine,所以当fmt.Println(“Hello World!”)执行时,主goroutine完成,我们退出程序,而不管其他goroutine可能在后台做什么。因此,我们看不到WelcomeMessage()goroutine的输出,因为程序甚至在WelcomeMessage()函数完成之前就退出了。

package main
import "fmt"

func WelcomeMessage(){
    fmt.Println("Welcome to Educative!")
}

func main() {
  go WelcomeMessage()
  go func(){
    fmt.Println("Hello World!")
  }()
}

以上程序没有输出,这是由于主goroutine再次完成,导致程序在我们从第9行和第10行的goroutine中获得结果之前退出。现在暂停我们的主要goroutine,并给其他goroutine时间来完成,如下面的例子所示。

package main
import (
  "fmt"
  "time"
)

func WelcomeMessage(){
    fmt.Println("Welcome to Educative!")
}

func main() {
  go WelcomeMessage()
  go func(){
    fmt.Println("Hello World!")
  }()

  time.Sleep(time.Millisecond*200)
}

现在,可以看到看到在main中创建的两个goroutine的结果,因为我们使用了time.Sleep()函数来造成时间延迟,从而允许其他goroutine在我们退出程序之前完成。