2014-09-25 29 views
5

是否有(非破壞性)方式來列出緩衝通道中的所有元素?列出緩衝通道中的所有元素

我能想到的唯一的事情就是循環所有這些,重新插入它們。這似乎並不是最聰明的做法。

Link to playground

c := make(chan int, 100) 
c <- 111 
c <- 222 
for i:=0;i<2;i++ { 
element := <- c 
fmt.Println(element) 
c <- element 
} 
fmt.Println(len(c)) 

回答

4

這個thread from 2011提供了一個包裝通道,以啓用一個Peek()函數,但這比其他任何東西都更容易解決。

type PeekChanInt struct { 
     in <-chan int 
     out chan int 
} 

總的結論是:

同步信道沒有頭(它就像一個零長度片)

你不能這樣做,因爲

  • a)它被放回隊列尾部而不是尾部,b)作者可能會去先放在那裏,所以放置可能會阻止。

我以前想要這樣的功能。當通道中只有一個消費者時(我希望它在第一個鼠標事件中進行點擊測試,然後再決定是否使用它),它纔有意義。

您可以使用充當中介的進程來模擬它,但是您必須爲每個通道類型執行此操作或丟失類型安全性。

請記住,沒有緩衝,所以如果你偷看一個值,你將不得不從另一端獲得價值,這相當於閱讀它 - 但這是錯誤的,因爲偷看應該沒有副作用

+0

這是什麼意思在這方面「沒有頭」? – meto 2014-09-26 01:52:47

+1

@meto這意味着沒有索引,頭部(索引0)和直接訪問頻道中特定位置的可能性。 – VonC 2014-09-26 06:02:54

4

,你不行,如果你想這樣做,你可以寫一個基於名單上自己的阻塞隊列。

1

你不可能真的。你有什麼是唯一的方法,但不要這樣做,如果有任何併發​​訪問chan(那麼你爲什麼使用陳)?

檢查len後,以及您的for循環期間可以插入或刪除項目。