第四十六: 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()
}
相关推荐
小当家.105几秒前
Token成本控制实战:语义缓存、上下文压缩与工具缓存
java·spring·缓存·token·上下文
乐观勇敢坚强的老彭3 分钟前
C++ STL 常用容器的速查表
java·c++·算法
wwwzhouzy7 分钟前
SpringBoot 响应式编程
java·spring boot·后端·响应式编程
数据库小学妹11 分钟前
空间数据库查询慢怎么排查?索引失效、表膨胀、SQL优化实战(附排查命令)
数据库·性能优化·信创·故障排查·索引调优·空间数据库
IT_陈寒16 分钟前
Redis的KEYS命令差点把我的生产环境拖垮,改用SCAN吧
前端·人工智能·后端
Bonnie_121520 分钟前
10-深入理解ConcurrentHashMap(JDK1.8)
java·开发语言
deli00700721 分钟前
打飞碟射击场:霓虹星空下飞碟满天飞,鼠标点射一枪一个
前端·ai编程
莫得感情 o22 分钟前
设计模式 22 · 三个冷门模式:中介者、访问者、解释器
java·设计模式
Cloud云卷云舒25 分钟前
从墨天轮排名中,分析近期增速快、中长期具备高潜力国产数据库
数据库·haishandb·工业云
lsylalalala30 分钟前
mysql-索引1
数据库·mysql