欢迎回到我们的Go专栏!在这篇文章中,我们将详细讨论Go语言的并发模型,重点是 Goroutines 和 Channels。
Goroutine 是 Go 语言中并发设计的核心。你可以把它理解为一个轻量级的线程。当我们启动一个函数作为 Goroutine 时,Go 会在一个新的 Goroutine 中运行这个函数,而不会阻塞当前的执行流程。
以下是一个 Goroutine 的基本示例:
package main
import (
"fmt"
"time"
)
func say(s string) {
for i := 0; i < 3; i++ {
time.Sleep(100 * time.Millisecond)
fmt.Println(s)
}
}
func main() {
go say("world")
say("hello")
}
在这个例子中,say("world")
在一个新的 Goroutine 中运行,而say("hello")
在当前的 Goroutine 中运行。
Channels 是 Go 中的一种类型,可以用于在 Goroutines 之间安全地传递数据。一个 Channel 是一个通道,可以通过它发送和接收值。
以下是一个 Channels 的基本示例:
package main
import "fmt"
func sum(s []int, c chan int) {
sum := 0
for _, v := range s {
sum += v
}
c <- sum // send sum to c
}
func main() {
s := []int{7, 2, 8, -9, 4, 0}
c := make(chan int)
go sum(s[:len(s)/2], c)
go sum(s[len(s)/2:], c)
x, y := <-c, <-c // receive from c
fmt.Println(x, y, x+y)
}
在这个例子中,我们创建了一个新的 Channel c
,然后在两个 Goroutine 中计算 s
的和,并将结果发送到 c
。在主 Goroutine 中,我们从 c
中接收并打印这两个结果。
Goroutines 和 Channels 一起使用时,可以编写出强大、高效和简洁的并发代码。这也是 Go 语言最显著的特性之一。