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")
}

运行又正常了。

 

posted @   Sawyer Ford  阅读(190)  评论(0)    收藏  举报
编辑推荐:
· 如何统计不同电话号码的个数?—位图法
· 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脚本编程入门
点击右上角即可分享
微信分享提示