我做了這個簡單的代碼,試圖瞭解如何爲頻道的作品,不知何故,如果發送通道B之後發送通道c,在過去的常規通道沒有被髮送,它是一個通道OPS影響到另一個通道OPS
我有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)
}
這個代碼實際上並不清楚你不清楚這個代碼。你期望得到什麼以及你實際得到了什麼? – zerkms
你有沒有運行代碼?請檢查跑步者功能,如果你先發送到頻道c然後b,你會有合適的條件,這是我不明白的,我希望有人會解釋這個頻道的行爲 –
「你會有合適的條件」 ---這是問題的問題:你沒有解釋什麼是「正確」,什麼是「錯誤」。 PS:請儘量避免使用「c」,「u」,「b」和其他縮寫。 – zerkms