【发布时间】:2017-08-26 10:32:45
【问题描述】:
我做了这个简单的代码,想知道通道是如何工作的,不知何故,如果通道 b 发送后通道 c 被发送,最后一个例程中的通道不会被发送,
我有 2 个通道,通道 c 用于将通道 b 拆分为切片的 4 部分。
package main
import (
"fmt"
"strconv"
)
func runner(idx int, c chan []int, b chan []int) {
var temp []int
fmt.Println("runner " + strconv.Itoa(idx))
bucket := <-b
for k, v := range bucket {
if v != 0 {
temp = append(temp, v)
bucket[k] = 0
}
if len(temp) == 5 {
break
}
}
//Strange condition if channel c is sent after channel b is sent,
//somehow the last chan is not being sent
b <- bucket
c <- temp
//this is right if channel b is sent after channel c is sent
//c <- temp
//b <- bucket
}
func printer(c chan []int) {
for {
select {
case msg := <-c:
fmt.Println(msg)
//time.Sleep(time.Second * 1)
}
}
}
func main() {
c := make(chan []int, 5)
bucket := make(chan []int)
go runner(1, c, bucket)
go runner(2, c, bucket)
go runner(3, c, bucket)
go runner(4, c, bucket)
bucket <- []int{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}
go printer(c)
var input string
fmt.Scanln(&input)
}
【问题讨论】:
-
这段代码对你来说实际上不清楚的地方并不明显。您期望得到什么以及实际得到什么?
-
你运行代码了吗?请检查 runner 功能,如果你先发送到通道 c 然后 b,你将有正确的条件,这是我不明白的,我希望有人解释这个通道行为
-
"你会有正确的条件" ---这就是问题的问题:你没有解释什么是“正确”,什么是“错误”。 PS:请尽量避免使用“c”、“u”、“b”等缩写。
-
谢谢@zerkms,kennytm 指出来吧