第四十六: 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()
}
相关推荐
岳麓丹枫00117 分钟前
PostgreSQL 中 pg_wal 目录里的 .ready .done .history 文件的生命周期
数据库·postgresql
寻星探路4 小时前
【深度长文】万字攻克网络原理:从 HTTP 报文解构到 HTTPS 终极加密逻辑
java·开发语言·网络·python·http·ai·https
崔庆才丨静觅6 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
陌上丨6 小时前
Redis的Key和Value的设计原则有哪些?
数据库·redis·缓存
曹牧7 小时前
Spring Boot:如何测试Java Controller中的POST请求?
java·开发语言
passerby60617 小时前
完成前端时间处理的另一块版图
前端·github·web components
AI_56787 小时前
AWS EC2新手入门:6步带你从零启动实例
大数据·数据库·人工智能·机器学习·aws
掘了7 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅7 小时前
实用免费的 Short URL 短链接 API 对接说明
前端