Go 的并发编程模型是基于 Goroutine 和 Channel 实现的。
-
Goroutine:类似于线程,但是比线程更加轻量级。可以使用 go 关键字来启动一个 goroutine。
-
Channel:是一种特殊的数据类型,用于在 goroutine 之间传递数据。可以使用 make 函数创建一个 channel,也可以使用 <- 符号将数据发送到 channel 或从 channel 接收数据。
下面是一个简单的并发编程的例子:
package main
import (
"fmt"
)
func worker(done chan bool) {
fmt.Println("working...")
done <- true
}
func main() {
done := make(chan bool, 1)
go worker(done)
<-done
fmt.Println("done")
}
这个例子中,我们定义了一个 worker 函数,它接收一个类型为 chan bool 的参数 done。在 worker 函数内部,我们打印了"working..."后将一个 true 值发送到 done channel 中。
在 main 函数中,我们使用 make 函数创建了一个类型为 chan bool,缓冲区大小为 1 的 channel。然后我们使用 go 关键字启动了一个 goroutine 来运行 worker 函数,在启动完 goroutine 后,我们从 done channel 中接收一个值,此时 main 函数将被阻塞,直到 done channel 中有值被发送过来为止。最后,我们再打印一个"done"表示程序结束了。
这是一个非常简单的例子,但是它展示了 Goroutine 和 Channel 相互配合的威力。在真实的应用中,我们可以使用 Goroutine 和 Channel 结合处理比这个例子更加复杂的并发任务,从而提高程序的性能和并发能力。