我需要幫助來理解為什么以下代碼不起作用。我正在構建一個管道并嘗試執行一個步驟來同步來自兩個源通道的值。我的源代碼/生成器代碼如下所示(在我的真實代碼中,我從文件中讀取文本)。來源已排序,但不能保證值在兩個來源中。func Source() <-chan int{ out := make(chan int, 5) go func() { defer reader.Close() out <- 1 out <- 2 out <- 3 out <- 4 out <- 5 out <- 7 close(out) }() return out}同步代碼如下所示:func Sync(a, b <-chan int) <-chan int { out := make(chan int) go func() { av, ak:= <-a bv, bk:= <-b for ak || bk { if !ak || av < bv { out <- bv bv, bk = <-b continue } if !bk|| bv > av { out <- av av, ak = <-a continue } out <- av av, ak = <-a bv, bk = <-b } close(out) }() return out}我的程序看起來像這樣:func main() { os := Source() ns := Source() for val := range Sync(ns, os) { fmt.Printf("[SYNCED] %v \n", val) }}預期的行為是我的兩個源都將值緩沖到通道中,而我的同步首先從第一個源讀取值。然后從第二。比較它們,如果它們相等,則繼續兩個通道中的下一個。如果不同,我們將發送后面的值并用新值替換它并再次進行相同的比較。發生的事情是,看起來同步代碼對這些值運行了幾次,我會多次得到 [SYNCED] 1 之類的東西。為什么?
- 1 回答
- 0 關注
- 169 瀏覽
添加回答
舉報
0/150
提交
取消