Bir kanaldaki öğe sayısı


88

Tamponlanmış bir kanal kullanarak, kanalda kaç öğe olduğunu nasıl ölçebilirsiniz? Örneğin, bunun gibi bir kanal oluşturuyor ve gönderiyorum:

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

Kaç ölçmek istiyorum msj kanal içindedir send_ch .

Ölçüm ve eylem arasında ön-alım olabileceğinden, eşzamanlılık nedeniyle ölçümün kesin olmayacağının farkındayım (örneğin, bu videoda Google I / O 2012 - Go Eş Zamanlılık Modelleri tartışılmıştır ). Bunu üreticiler ve tüketiciler arasındaki akış kontrolü için kullanacağım, yani yüksek bir filigrandan geçtikten sonra, düşük bir filigrandan geçene kadar bazı davranışları değiştireceğim.

Yanıtlar:


155

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

func len (v Type) int
len yerleşik işlevi türüne göre v'nin uzunluğunu döndürür:

  • Dizi: v.
  • İşaretçi diziye: * v'deki öğelerin sayısı (v sıfır olsa bile).
  • Dilim veya harita: v'deki öğelerin sayısı; v sıfır ise, len (v) sıfırdır.
  • Dize: v'deki bayt sayısı.
  • Kanal: kanal arabelleğinde sıraya alınan (okunmamış) öğelerin sayısı; v sıfır ise, len (v) sıfırdır.
package main

import "fmt"

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

çıktı:

34

4
Teşekkürler Artem. Bu beklenmedik bir len kullanımıdır - Bir kanalın kapasitesini döndürmesini beklerdim, içindeki öğelerin sayısını değil! Bilmek güzel, tekrar teşekkürler.
Sonia Hamilton

40
Kapasiteyi istiyor olsaydınız, yerleşik işlev capbunu yapardı.
ANisus

6
Burada ilginç bulduğum şey, eğer kanal kapasite ( c := make(chan int)) olmadan yapılırsa uzunluğunu alamazsınız. Bunun için bir sebep bulamadım. Evet, kapasitesi de 0 olarak geri dönüyor
Brettski

Tampon olmadığında uzunluğunu alamadığım için kendimi garip hissediyorum. Ve gorutinleri kullanırken, biraz karışıklık yaratır.
Berkant İpek

7
@Brettski ve Berkant, Kanal arabelleğe alınmamışsa (kapasite = 0), uzunluk her zaman sıfır olacaktır. Gönderen, alıcı değeri alana kadar bloke eder. golang.org/doc/effective_go.html#channels
Farshid T
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.