Go语言协程创建教程

是 中的轻量级线程实现,由 Go 运行时(runtime)管理。Go 程序会智能地将 goroutine 中的任务合理地分配给每个 CPU。

Go 程序从 main 的 开始,在程序启动时,Go 程序就会为 main() 函数创建一个默认的 goroutine。

goroutine创建方法

在 Go 程序中使用 go 关键字为一个 创建一个 goroutine。在 golang 中,创建 goroutine 有两种方法,分别为:使用普通函数创建和使用匿名函数创建。

普通函数创建goroutine

语法

go funcName(paramlist)

参数

参数 描述
go 创建协程使用的关键字。
funcName 协程名。
paramlist 协程参数。

说明

其中,go 是创建 goroutine 使用的关键字,funcName 是需要使用的函数名,paramlist 是 。

使用 go 关键字创建 goroutine 时,被调用函数的 会被忽略。如果需要在 goroutine 中返回数据,需要使用 (chan)特性,通过通道把数据从 goroutine 中作为返回值传出。

匿名函数创建goroutine

语法

go func( paramlist ){ //do something }( paramlist2 )

参数

参数 描述
go 创建协程使用的关键字。
func 创建协程使用的关键字。
paramlist 协程的形式参数。
paramlist2 协程的实参。

说明

其中,go 是创建 goroutine 使用的关键字,func 是创建 使用的关键字,paramlist 是匿名函数使用的形参,paramlist2 是该匿名函数的实参。

案例

普通函数创建goroutine

使用普通函数,加上 go 关键字,创建 goroutine

package main import ( "fmt" "time" ) func printInfo(s string){ for{ fmt.Println("Info =", s) // 延时1秒 time.Sleep(time.Second) } } func main() { fmt.Println("嗨客网(www.haicoder.net)") // 使用普通函数,加上 go 关键字,创建 goroutine go printInfo("HaiCoder Golang") }

程序运行后,控制台输出如下:

06_goroutine创建.png

首先,我们创建了一个 printInfo 函数,该函数接受一个 类型的参数,没有任何返回值,在该函数里,我们通过 实现了一个死循环,每次循环都使用 print 打印一句话,并且没执行一次循环后,使用 Sleep 函数实现睡眠一秒钟。

最后,在 main 函数,我们使用 go 关键字和函数 printInfo 来实现创建了一个 goroutine,运行后,程序直接退出,没有输出任何信息。接着,我们将程序修改如下:

package main import ( "fmt" "time" ) func printInfo(s string){ for{ fmt.Println("Info =", s) // 延时1秒 time.Sleep(time.Second) } } func main() { fmt.Println("嗨客网(www.haicoder.net)") // 使用普通函数创建 goroutine go printInfo("HaiCoder Golang") time.Sleep(time.Duration(3) * time.Second) }

此时,程序输出如下信息:

07_goroutine创建.png

我们看到,程序输出了四次之后,程序退出了,我们没有在 main 函数中,使用 Sleep 时,程序就直接退出,是因为 goroutine 不会阻塞程序的运行,因此,程序会立刻退出。

而我们在 main 函数里面加了 sleep 之后,此时,主程序没有退出,因此 goroutine 有时间运行了,此时需要等 main 函数运行完毕后,goroutine 才会终止运行。

匿名函数创建goroutine

使用匿名函数,加上 go 关键字,创建 goroutine

package main import ( "fmt" "time" ) func main() { fmt.Println("嗨客网(www.haicoder.net)") // 使用匿名函数,加上 go 关键字,创建 goroutine go func(s string) { for{ fmt.Println("Info =", s) // 延时1秒 time.Sleep(time.Second) } }("嗨客网 Golang") }

程序运行后,控制台输出如下:

08_goroutine创建.png

首先,在 main 函数里面,我们使用 go 关键字,加上匿名函数,创建了一个 goroutine,该匿名函数接受一个 string 类型的参数,没有任何返回值,在该匿名函数里,我们通过 for 实现了一个死循环,每次循环都使用 print 打印一句话,并且没执行一次循环后,使用 Sleep 函数实现睡眠一秒钟。

()
package main import ( "fmt" "time" ) func main() { fmt.Println("嗨客网(www.haicoder.net)") // 使用匿名函数,加上 go 关键字,创建 goroutine go func(s string) { for{ fmt.Println("Info =", s) // 延时1秒 time.Sleep(time.Second) } }("嗨客网 Golang") time.Sleep(time.Duration(3) * time.Second) }

此时,程序输出如下信息:

09_goroutine创建.png

我们看到,程序输出了四次之后,程序退出了,我们没有在 main 函数中,使用 Sleep 时,程序就直接退出,是因为即使是使用匿名函数创建的 goroutine 也不会阻塞程序的运行,因此,程序会立刻退出。

Go语言协程创建教程总结

在 Go 程序中使用 go 关键字为一个函数创建一个 goroutine。在 golang 中,创建 goroutine 有两种方法,分别为:使用普通函数创建和使用匿名函数创建。普通函数创建 goroutine 语法:

go funcName(paramlist)

匿名函数创建 goroutine 语法:

go func( paramlist ){ //do something }( paramlist2 )