第四十六: 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()
}
相关推荐
captain3763 小时前
MyBatis(入门5)其他查询操作
java·数据库·spring boot·mybatis
jktantan3 小时前
Vue keep-alive 切标签后滚动位置回顶?因为 onDeactivated 里读到的 scrollTop 是 0
前端·javascript·vue.js
Novproxy_Z3 小时前
商用代理避坑:如何识别商家拿机房 IP 冒充住宅 IP
java·网络·tcp/ip
小此方4 小时前
Re:Mysql数据库基础篇(八):详细讲解复合查询、多表查询、自连接、多行、多列子查询与合并查询
数据库·mysql
xszivvvv4 小时前
Mariadb数据库frm文件异常,如何恢复数据
数据库·mariadb
文丑颜不良啊4 小时前
LeetCode1481~1500题目解析
java·leetcode
2601_962885724 小时前
quotes 字段全解:涨跌幅、振幅、换手率的口径与单位
java·前端·spring
excel5 小时前
encodeURI 和 encodeURIComponent 有什么区别?
前端
smile_life_5 小时前
MySQL 设置 防止账户被暴力破解
数据库·mysql
前端精髓5 小时前
调用openrouter的免费API模型
java·前端·javascript