จำนวนองค์ประกอบในช่อง


88

การใช้ช่องสัญญาณบัฟเฟอร์จะวัดจำนวนองค์ประกอบในช่องได้อย่างไร ตัวอย่างเช่นฉันกำลังสร้างและส่งในช่องเช่นนี้:

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

ฉันต้องการที่จะวัดว่าหลายmsgsอยู่ในช่องsend_ch

ฉันทราบว่าเนื่องจากการเกิดขึ้นพร้อมกันการวัดผลจะไม่แน่นอนเนื่องจากอาจเกิดการสุ่มตัวอย่างล่วงหน้าระหว่างการวัดและการกระทำ (เช่นที่กล่าวถึงในวิดีโอนี้Google I / O 2012 - Go Concurrency Patterns ) ฉันจะใช้สิ่งนี้เพื่อควบคุมการไหลระหว่างผู้ผลิตและผู้บริโภคเช่นเมื่อฉันผ่านลายน้ำสูงเปลี่ยนพฤติกรรมบางอย่างจนกว่าฉันจะผ่านลายน้ำต่ำ

คำตอบ:


155

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

func len (v Type) int ฟังก์ชัน
len ในตัวจะส่งกลับความยาวของ v ตามประเภท:

  • Array: จำนวนองค์ประกอบใน v.
  • ตัวชี้ไปยังอาร์เรย์: จำนวนองค์ประกอบใน * v (แม้ว่า v จะเป็นศูนย์)
  • Slice หรือ map: จำนวนองค์ประกอบใน v; ถ้า v เป็นศูนย์ len (v) เป็นศูนย์
  • String: จำนวนไบต์ใน v
  • ช่อง: จำนวนองค์ประกอบที่อยู่ในคิว (ยังไม่ได้อ่าน) ในช่องบัฟเฟอร์ ถ้า v เป็นศูนย์ len (v) เป็นศูนย์
package main

import "fmt"

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

จะส่งออก:

34

4
ขอบคุณ Artem นั่นเป็นการใช้ len ที่ไม่คาดคิด - ฉันคาดว่ามันจะคืนความจุของช่องไม่ใช่จำนวนองค์ประกอบในนั้น! ขอขอบคุณอีกครั้ง
Sonia Hamilton

40
หากคุณต้องการความจุฟังก์ชันในตัวcapก็จะทำเช่นนั้น
ANisus

6
สิ่งที่ฉันคิดว่าน่าสนใจที่นี่คือถ้าช่องถูกสร้างขึ้นโดยไม่มีความจุ ( c := make(chan int)) คุณจะไม่สามารถรับความยาวได้ ฉันไม่พบเหตุผลสำหรับเรื่องนี้ ใช่ความจุจะกลับมาเป็น 0 เช่นกัน
Brettski

ฉันรู้สึกแปลก ๆ ที่เมื่อมันไม่มีสิ่งกีดขวางฉันก็ไม่สามารถรับความยาวได้ และเมื่อใช้ goroutines ก็จะทำให้สับสน
Berkant Ipek

7
@Brettski และ Berkant หากช่องไม่ถูกบัฟเฟอร์ (ความจุ = 0) ความยาวจะเป็นศูนย์เสมอ ผู้ส่งบล็อกจนกว่าผู้รับจะได้รับค่า golang.org/doc/effective_go.html#channels
Farshid T
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.