Jumlah elemen dalam saluran

87

Dengan menggunakan saluran buffer, bagaimana cara mengukur berapa banyak elemen yang ada di saluran? Misalnya, saya membuat dan mengirimkan saluran seperti ini:

send_ch := make(chan []byte, 100)
// code
send_ch <- msg

Saya ingin mengukur berapa banyak pesan di saluran send_ch .

Saya sadar bahwa karena konkurensi, pengukurannya tidak akan tepat, karena tindakan pencegahan dapat terjadi antara pengukuran dan tindakan (misalnya dibahas dalam video ini Google I / O 2012 - Buka Pola Konkurensi ). Saya akan menggunakan ini untuk kontrol aliran antara produsen dan konsumen yaitu setelah saya melewati tanda air yang tinggi, mengubah beberapa perilaku sampai saya melewati tanda air yang rendah.

Sonia Hamilton
sumber

Jawaban:

154

http://golang.org/pkg/builtin/#len

func len (v Type) int
Fungsi built-in len mengembalikan panjang v, menurut tipenya:

  • Array: jumlah elemen dalam v.
  • Pointer ke array: jumlah elemen dalam * v (bahkan jika v adalah nil).
  • Slice, atau map: jumlah elemen dalam v; jika v adalah nihil, len (v) adalah nol.
  • String: jumlah byte dalam v.
  • Channel: jumlah elemen yang antri (belum dibaca) di buffer channel; jika v adalah nihil, len (v) adalah nol.
package main

import "fmt"

func main() {
        c := make(chan int, 100)
        for i := 0; i < 34; i++ {
                c <- 0
        }
        fmt.Println(len(c))
}

akan mengeluarkan:

34
Artem Shitov
sumber
4
Terima kasih Artem. Itu adalah penggunaan len yang tidak diharapkan - Saya akan mengharapkannya untuk mengembalikan kapasitas saluran, bukan jumlah elemen di dalamnya! Senang mengetahui, terima kasih sekali lagi.
Sonia Hamilton
40
Jika Anda menginginkan kapasitas, maka fungsi bawaan capakan melakukannya.
ANisus
6
Yang menarik di sini adalah jika saluran dibuat tanpa kapasitas ( c := make(chan int)) Anda tidak bisa mendapatkan panjangnya. Saya belum menemukan alasan untuk ini. Ya, kapasitasnya juga kembali 0
Brettski
Saya merasa aneh bahwa ketika tidak ada buffer, saya tidak bisa mendapatkan panjangnya. Dan saat menggunakan goroutine, itu agak kacau.
Berkant Ipek
7
@Brettski dan Berkant, Jika saluran tidak buffer (kapasitas = 0), panjangnya akan selalu nol. Pengirim memblokir sampai penerima menerima nilainya. golang.org/doc/effective_go.html#channels
Farshid T