2014-09-25 18 views
5

Có cách nào (không phá hủy) để liệt kê tất cả phần tử trong kênh đệm không?liệt kê tất cả các phần tử trong kênh đệm

Điều duy nhất tôi có thể nghĩ đến là xoay vòng tất cả chúng, lắp lại vào cuối. Đây không phải là cách tiếp cận thông minh nhất.

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

Trả lời

4

thread from 2011 cung cấp một số trình bao bọc xung quanh một kênh để bật chức năng Peek(), nhưng đó là giải pháp thay thế nhiều hơn bất kỳ thứ gì khác.

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

Kết luận chung là:

Một kênh đồng bộ không có người đứng đầu (nó giống như một lát zero-length)

Bạn không thể làm điều đó bởi vì

  • a) nó được đưa trở lại ở đuôi của hàng đợi thay vì kết thúc và
  • b) một nhà văn có thể đã đi t có đầu tiên, do đó, đặt có thể chặn.

Tôi đã muốn có một tính năng như thế này trong quá khứ. Nó có thể có ý nghĩa khi chỉ có một người tiêu dùng của kênh (tôi muốn nó nhìn trộm tại sự kiện chuột đầu tiên để thực hiện thử nghiệm hit trước khi quyết định có nên sử dụng nó hay không)

Bạn có thể mô phỏng nó bằng một quy trình làm trung gian, nhưng bạn phải làm điều đó cho từng loại kênh hoặc mất an toàn loại.

Hãy nhớ rằng không có bộ đệm, vì vậy nếu bạn nhìn vào giá trị, bạn phải lấy giá trị từ phía bên kia, tương đương với việc đọc nó - nhưng điều đó sai vì nhìn trộm không có tác dụng phụ.

+0

ngữ cảnh này "không có đầu" nghĩa là gì? – meto

+1

@meto nghĩa là không có chỉ mục, có đầu (chỉ số 0) và khả năng truy cập trực tiếp vào vị trí cụ thể trong kênh. – VonC

4

Không bạn không thể, bạn có thể viết hàng đợi chặn của riêng bạn dựa trên một danh sách nếu bạn muốn làm điều đó.

1

Bạn thực sự không thể. Những gì bạn có là cách duy nhất, nhưng không làm điều đó nếu có bất kỳ quyền truy cập đồng thời vào chan (và sau đó tại sao bạn đang sử dụng một chan?).

Các mục có thể được chèn hoặc xóa sau khi bạn kiểm tra len và trong vòng lặp for của bạn.

Các vấn đề liên quan