首页 > 编程笔记 > Go语言笔记 阅读:222

Go语言go关键字创建协程

Go 语言是从 main() 函数开始执行,程序启动默认为 main() 函数创建一个协程,只要函数中使用关键字 go 即可创建新的协程执行并发。

关键字 go 后面设置某个函数,让协程对该函数执行并发操作,其语法如下:
go func(parameter)
语法格式说明如下:
按照关键字 go 的语法格式,通过示例说明如何实现 Go 语言的并发编程,示例如下:
package main

import (
    "fmt"
    "time"
)

func running() {
    // 循环5次
    for i := 0; i < 5; i++ {
         fmt.Println("tick", i)
         // 延时1秒
         time.Sleep(1 * time.Second)
    }
}

func main() {
    // 并发执行程序
    go running()
    // 主程序
    for i := 0; i < 5; i++ {
         time.Sleep(1 * time.Second)
         fmt.Println("Waitting for you")
    }
}
运行上述代码,结果为:

tick 0
tick 1
Waitting for you
Waitting for you
tick 2
tick 3
Waitting for you
Waitting for you
tick 4
Waitting for you

从运行结果看到,程序首先为 main() 函数创建一个协程,然后使用关键字 go 为函数 running() 创建新的协程,Go 语言的调度机制自动为两个协程进行资源调度,从而完成并发过程。

我们知道函数定义可以分为 4 种类型,分别是:
在并发操作中,有返回值的函数会被忽略返回值,如果需要从并发中返回数据,只能使用通道实现,将需要返回的数据写入通道,主函数或其他并发函数都能从通道读取数据,从而实现数据共享。

定义并发函数只需要考虑是否需要设置函数参数,下面通过示例讲述带参数的函数如何实现并发过程:
package main

import (
    "fmt"
    "time"
)

func running(name string) {
    // 循环5次
    for i := 0; i < 5; i++ {
         fmt.Printf("tick %v, %v\n", i, name)
         // 延时1秒
         time.Sleep(1 * time.Second)
    }
}

func main() {
    // 并发执行程序
    var name = "Tom"
    go running(name)
    // 主程序
    for i := 0; i < 5; i++ {
         time.Sleep(1 * time.Second)
         fmt.Println("Waitting for you")
    }
}
代码的运行结果为:

tick 0, Tom
Waitting for you
tick 1, Tom
Waitting for you
tick 2, Tom
Waitting for you
tick 3, Tom
Waitting for you
tick 4, Tom
Waitting for you