golang之channel
Buffered Channels
1 2 3 4 5 6 7 8 9 10 11 | package main import "fmt" func main() { ch := make( chan int, 2) ch <- 1 ch <- 2 fmt.Println(<-ch) fmt.Println(<-ch) } |
如果操作一个空的channel会怎么样呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | package main import "fmt" func main() { ch := make( chan int, 2) ch <- 1 ch <- 2 fmt.Println(<-ch) fmt.Println(<-ch) v, ok := <-ch fmt.Println(v,ok) } |
1
2
fatal error: all goroutines are asleep - deadlock!
如果make函数不指定buffer length,会怎么样呢?
1 2 3 4 5 | func main() { ch := make( chan int) ch <- 1 fmt.Println(<-ch) } |
fatal error: all goroutines are asleep - deadlock!
上述例子中sender,receiver都是同一个线程。
如果sender,receiver是不同线程会怎么样呢?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package main import "fmt" import "time" func WriteChannel(c chan int, v int) { fmt.Printf( "write %d to channel\n" , v) c <- v } func main() { c := make( chan int) go WriteChannel(c,1) fmt.Println(<-c) time.Sleep(100 * time.Millisecond) fmt.Printf( "Done\n" ) } |
运行又正常了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】凌霞软件回馈社区,携手博客园推出1Panel与Halo联合会员
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何统计不同电话号码的个数?—位图法
· C#高性能开发之类型系统:从 C# 7.0 到 C# 14 的类型系统演进全景
· 从零实现富文本编辑器#3-基于Delta的线性数据结构模型
· 记一次 .NET某旅行社酒店管理系统 卡死分析
· 长文讲解 MCP 和案例实战
· 微信支付功能的设计实现与关键实践(UniApp+Java)全代码
· 用c#从头写一个AI agent,实现企业内部自然语言数据统计分析
· 三维装箱问题(3D Bin Packing Problem, 3D-BPP)
· MCP协议Streamable HTTP
· Windows上,10分钟构建一个本地知识库
2016-12-07 Shell脚本编程入门