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") }
程序运行后,控制台输出如下:
首先,我们创建了一个 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) }
此时,程序输出如下信息:
我们看到,程序输出了四次之后,程序退出了,我们没有在 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") }
程序运行后,控制台输出如下:
首先,在 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) }
此时,程序输出如下信息:
我们看到,程序输出了四次之后,程序退出了,我们没有在 main 函数中,使用 Sleep 时,程序就直接退出,是因为即使是使用匿名函数创建的 goroutine 也不会阻塞程序的运行,因此,程序会立刻退出。
Go语言协程创建教程总结
在 Go 程序中使用 go 关键字为一个函数创建一个 goroutine。在 golang 中,创建 goroutine 有两种方法,分别为:使用普通函数创建和使用匿名函数创建。普通函数创建 goroutine 语法:
go funcName(paramlist)
匿名函数创建 goroutine 语法:
go func( paramlist ){ //do something }( paramlist2 )