Skip to content

协程

Do not communicate by sharing memory;
share memory by communicating.

goroutine 不共享状态,
用 channel 把数据在 goroutine 之间传递。

goroutine 是 Go 的轻量级线程(lightweight thread),运行时调度的函数执行单元。

由 Go 运行时调度,不直接映射到 OS 线程。

go
func sayHello(name string) {
    fmt.Println("Hello,", name)
}

func main() {
    go sayHello("Alice") // 在新的 goroutine 中执行
    fmt.Println("Main function")
}

channel / 信道

信道是带有类型的管道,你可以通过它用信道操作符 <- 来发送或者接收值。

go
ch := make(chan int)

go func() {
    ch <- 42  // 发送数据到 channel
}()

val := <-ch  // 接收数据
fmt.Println(val)

普通 channel “发”与“收”都会阻塞。

关闭 channel :

go
close(ch)

close 在 for 的时候很重要,如果没有主动关闭,for 可能会一直执行下去。

带缓冲的信道

go
ch := make(chan int, 2)  // 缓冲区容量是 2

发送方可以先发送 N 条数据(N = 缓冲区容量),不阻塞

缓冲区满了,才会阻塞