第四十六: 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()
}
相关推荐
码农小卡拉8 分钟前
深入解析Spring Boot文件加载顺序与加载方式
java·数据库·spring boot
怣5012 分钟前
MySQL多表连接:全外连接、交叉连接与结果集合并详解
数据库·sql
向上的车轮15 分钟前
为什么.NET(C#)转 Java 开发时常常在“吐槽”Java:checked exception
java·c#·.net
Dragon Wu17 分钟前
Spring Security Oauth2.1 授权码模式实现前后端分离的方案
java·spring boot·后端·spring cloud·springboot·springcloud
跳动的梦想家h22 分钟前
环境配置 + AI 提效双管齐下
java·vue.js·spring
坚持就完事了24 分钟前
Java中的集合
java·开发语言
wjhx33 分钟前
QT中对蓝牙权限的申请,整理一下
java·数据库·qt
YCY^v^37 分钟前
JeecgBoot 项目运行指南
java·学习
夏幻灵43 分钟前
HTML5里最常用的十大标签
前端·html·html5
冰暮流星44 分钟前
javascript之二重循环练习
开发语言·javascript·数据库