select 多路复用 " 在某些场景下我们可能需要同时从多个通道接收数据,通道在解说数据时,如果没有数据可以被接收那么当前的 goroutine 将会发生阻塞" 你可能会这么写: 虽然可以实现需求,但是程序的运行性能会非常差。Go 语言内置了select关键字,使用它可以同时响应多个通道操作。 特点: 可处理一个或多个channel的发送/接收操作; 如果
2022年6月25日
案例
package main
import (
"fmt"
"sync"
)
// 多个goroutine并发操作全局变量x
var (
x int64
wg sync.WaitGroup
)
func add() {
for i := 0; i < 5000; i++ {
// 1. 拿到全局变量x
// 2. 给这个值+1
// 3. 加1后在赋值给全局变量x
x++ // 对全局变量进行每次+1
}
wg.Done()
}
func main() {
wg.Add(2)
go add()
go add()
wg.Wait()
fmt.Println(x) // 7180 5285 各种值
}