2014-09-25 9 views
5

Esiste un modo (non distruttivo) per elencare tutti gli elementi in un canale bufferizzato?elenca tutti gli elementi in un canale bufferizzato

L'unica cosa a cui riesco a pensare è di ciclarli tutti, reinserendoli alla fine. Questo non sembra l'approccio più intelligente.

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

risposta

4

Questo thread from 2011 offriva un involucro attorno a un canale per abilitare una funzione Peek(), ma era più una soluzione che altro.

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

La conclusione generale era:

Un canale sincrono ha testa (è come una fetta di lunghezza zero)

Non è possibile farlo perché

  • a) viene rimandato alla coda della coda anziché alla fine e
  • b) uno scrittore potrebbe essere andato Là prima, quindi il put può bloccare.

Ho desiderato una funzionalità come questa in passato. Può avere senso quando c'è un solo consumatore del canale (volevo che guardasse al primo evento del mouse per eseguire il test prima di decidere se consumarlo)

È possibile simularlo con un processo che funge da intermediario, ma dovresti farlo per ogni tipo di canale o perdere la sicurezza del tipo.

Ricordare che non c'è buffer, quindi se si sbircia un valore, si dovrebbe ottenere il valore dall'altra parte, che sarebbe equivalente a leggerlo - ma questo è sbagliato perché lo sdoganamento non dovrebbe avere effetti collaterali.

+0

cosa significa in questo contesto "non ha testa"? – meto

+1

@meto significa che non esiste un indice, con una testa (indice 0) e la possibilità di accedere direttamente a una posizione specifica nel canale. – VonC

4

No non si può, si può scrivere il proprio coda di blocco sulla base di una lista, se si vuole fare questo.

1

Non puoi davvero. Quello che hai è l'unico modo, ma non farlo se c'è un accesso concorrente allo chan (e allora perché stai usando un chan?).

Gli articoli possono essere inseriti o rimossi dopo aver controllato len e durante il ciclo for.

Problemi correlati