第四十六: channel 高级使用

一: 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()
}
相关推荐
还在忙碌的吴小二7 分钟前
Harness 最佳实践:Java Spring Boot 项目落地 OpenSpec + Claude Code
java·开发语言·spring boot·后端·spring
风吹迎面入袖凉7 分钟前
【Redis】Redis的五种核心数据类型详解
java·redis
一袋米扛几楼987 分钟前
【网络安全】SIEM -Security Information and Event Management 工具是什么?
前端·安全·web安全
NineData14 分钟前
NineData 智能数据管理平台新功能发布|2026 年 3 月
数据库·oracle·架构·dba·ninedata·数据复制·数据迁移工具
夕除14 分钟前
javaweb--02
java·tomcat
小陈工18 分钟前
2026年4月7日技术资讯洞察:下一代数据库融合、AI基础设施竞赛与异步编程实战
开发语言·前端·数据库·人工智能·python
❀͜͡傀儡师19 分钟前
k8s部署的Nexus 3 数据库损坏恢复指南:从删除损坏数据库到完整数据重建
数据库·kubernetes·nexus3
ailvyuanj19 分钟前
2026年Java AI开发实战:Spring AI完全指南
java
Cobyte27 分钟前
3.响应式系统基础:从发布订阅模式的角度理解 Vue2 的数据响应式原理
前端·javascript·vue.js
竹林81831 分钟前
从零到一:在React前端中集成The Graph查询Uniswap V3池数据实战
前端·javascript