Go 并发模式:从 goroutine 到 channel

goroutine 基础

Go 的并发基于 goroutine,它是一个轻量级线程。启动一个 goroutine 只需要在函数调用前加上 go 关键字。

1
2
3
4
func main() {
    go fmt.Println("Hello from goroutine")
    time.Sleep(time.Second)
}

Channel 通信

Channel 是 goroutine 之间通信的桥梁。

1
2
3
4
5
6
ch := make(chan string)
go func() {
    ch <- "hello"
}()
msg := <-ch
fmt.Println(msg)

Select 多路复用

select 语句可以同时等待多个 channel 操作。

1
2
3
4
5
6
7
8
select {
case msg := <-ch1:
    fmt.Println("from ch1:", msg)
case msg := <-ch2:
    fmt.Println("from ch2:", msg)
case <-time.After(time.Second):
    fmt.Println("timeout")
}