一: select
Go
select {
case msg1 := <-ch1:
fmt.Println("Received", msg1)
case msg2 := <-ch2:
fmt.Println("Received", msg2)
default:
fmt.Println("No data received")
}
// 声明通道:
ch := make(chan int)
ch <- data // 发送数据到通道
result := <-ch // 从通道接收数据
可以在协程中使用通道发送数据,并在另一个协程中接收数据,例如:
func main() {
ch := make(chan int)
go func() {
data := 10
ch <- data // 发送数据到通道
}()
result := <-ch // 从通道接收数据
fmt.Println(result) // 输出结果:10
}
3. Go语言协程之间如何进行数据共享和同步?
import "sync"
var mutex sync.Mutex
// 在需要修改共享资源的地方,可以使用互斥锁进行保护,例如:
mutex.Lock() // 加锁
// 修改共享资源的代码
mutex.Unlock() // 解锁


Map 扩容方式:

Golang channel 如何控制goroutine 的并发顺序:

Go 如何控制并发goroutine的数量

GC 如何调优

waitGroup 使用:



Go
func main() {
count := 10 // 最大支持并发
sum := 100 // 任务总数
wg := sync.WaitGroup{} //控制主协程等待所有子协程执行完之后再退出。
c := make(chan struct{}, count) // 控制任务并发的chan
defer close(c)
for i:=0; i<sum;i++{
wg.Add(1)
c <- struct{}{} // 作用类似于waitgroup.Add(1)
go func(j int) {
defer wg.Done()
fmt.Println(j)
<- c // 执行完毕,释放资源
}(i)
}
wg.Wait()
}