Go --- for range会使通道中的缓存值被取出

简介: Go --- for range会使通道中的缓存值被取出

今天在《Go语言高级编程》这本书中发现这么一段代码

上面的代码中消费者没有从通道中取值的操作像 <- ch,却可以一直运行,这让我怀疑是不是在for range 过程中将通道的缓存值取出了

于是我开始测试:

package main
import "fmt"
func main() {
// 测试for range是否会使通道中的缓存值取出
  ch := make(chan int,4)
  for i := 0; i < cap(ch); i++ {
    ch <- i
  }
  fmt.Println(len(ch))
  // for range可以使通道中的缓存值被取出
  for range ch {
    //fmt.Println(v)
    fmt.Println("len:", len(ch))
  }
}

运行结果如下

可以确认的是:for range 确实会使通道缓存中的值被取出。


相关文章
|
5月前
|
缓存 监控 安全
告别缓存击穿!Go 语言中的防并发神器:singleflight 包深度解析
在高并发场景中,多个请求同时访问同一资源易导致缓存击穿、数据库压力过大。Go 语言提供的 `singleflight` 包可将相同 key 的请求合并,仅执行一次实际操作,其余请求共享结果,有效降低系统负载。本文详解其原理、实现及典型应用场景,并附示例代码,助你掌握高并发优化技巧。
423 0
|
7月前
|
Go 开发者
Go 并发编程基础:无缓冲与有缓冲通道
本章深入探讨Go语言中通道(Channel)的两种类型:无缓冲通道与有缓冲通道。无缓冲通道要求发送和接收必须同步配对,适用于精确同步和信号通知;有缓冲通道通过内部队列实现异步通信,适合高吞吐量和生产者-消费者模型。文章通过示例对比两者的行为差异,并分析死锁风险及使用原则,帮助开发者根据场景选择合适的通道类型以实现高效并发编程。
|
9月前
|
缓存 NoSQL Go
【LeetCode 热题100】146:LRU 缓存(详细解析)(Go语言版)
本文详细解析了力扣 146 题——LRU 缓存机制的实现方法。通过结合哈希表与双向链表,确保 `get` 和 `put` 操作均在 O(1) 时间内完成。哈希表用于快速查找,双向链表记录访问顺序,支持最近使用数据的高效更新与淘汰。代码以 Go 语言实现,结构清晰,涵盖核心操作如节点移动、插入与删除。此题为面试高频考点,适用于数据缓存、页面置换等场景,掌握后可加深对缓存策略的理解。
501 4
|
存储 Go 开发者
Go语言中的并发编程与通道(Channel)的深度探索
本文旨在深入探讨Go语言中并发编程的核心概念和实践,特别是通道(Channel)的使用。通过分析Goroutines和Channels的基本工作原理,我们将了解如何在Go语言中高效地实现并行任务处理。本文不仅介绍了基础语法和用法,还深入讨论了高级特性如缓冲通道、选择性接收以及超时控制等,旨在为读者提供一个全面的并发编程视角。
307 50
|
Go 索引
go语音中range 循环
go语音中range 循环
203 12
|
Go 索引
go语言使用range关键字
go语言使用range关键字
162 7
|
安全 Java Go
Go语言中的并发编程:掌握goroutine与通道的艺术####
本文深入探讨了Go语言中的核心特性——并发编程,通过实例解析goroutine和通道的高效使用技巧,旨在帮助开发者提升多线程程序的性能与可靠性。 ####
|
安全 Go 索引
go语言使用 range 关键字
go语言使用 range 关键字
185 3
|
测试技术 Go 索引
go语言使用 range 关键字遍历
go语言使用 range 关键字遍历
201 3
|
安全 Go 调度
探索Go语言的并发模式:协程与通道的协同作用
Go语言以其并发能力闻名于世,而协程(goroutine)和通道(channel)是实现并发的两大利器。本文将深入了解Go语言中协程的轻量级特性,探讨如何利用通道进行协程间的安全通信,并通过实际案例演示如何将这两者结合起来,构建高效且可靠的并发系统。