2010-09-17 53 views
14

Vấn đề này khá phổ biến: một đối tượng nên thông báo cho tất cả người đăng ký khi một số sự kiện xảy ra. Trong C++, chúng tôi có thể sử dụng boost::signals hoặc một thứ khác. Nhưng làm thế nào để làm điều này trong ngôn ngữ Go? Nó sẽ là tốt đẹp để xem một số ví dụ mã làm việc, nơi một vài đối tượng được đăng ký với một nhà xuất bản và thông báo quá trình.Mẫu quan sát bằng ngôn ngữ Go

Cảm ơn

Trả lời

14

Điều này thực sự khá đơn giản trong Go. Sử dụng kênh. Đây là thứ mà họ đang làm.

type Publish struct { 
    listeners []chan *Msg 
} 

type Subscriber struct { 
    Channel chan *Msg 
} 

func (p *Publisher) Sub(c chan *Msg) { 
    p.appendListener(c) 
} 

func (p *Publisher) Pub(m *Msg) { 
    for _, c := range p.listeners { 
     c <- Msg 
    } 
} 

func (s *Subscriber) ListenOnChannel() { 
    for { 
     data := <-s.Channel 
     //Process data 
    } 
} 

func main() { 
    for _, v := range subscribers { 
     p.Sub(v.Channel) 
     go v.ListenOnChannel() 
    } 
    //Some kind of wait here 
} 

Rõ ràng đây không phải là mẫu mã hoạt động chính xác. Nhưng nó gần rồi.

+1

Hãy cẩn thận với việc chặn hoạt động của kênh. –

+0

@MizardX tất nhiên, thông thường tôi cũng muốn kiểm soát chan, như chan bool và sử dụng select {}, và thoát khỏi recv từ kênh điều khiển. Nhưng đó là tất cả khá tầm thường và một chút quá mức cho một ví dụ cơ bản. – cthom06

+1

@MizardX: không phải là một chút giống như nói "cẩn thận với số học con trỏ" trong C? Cẩn thận với các kênh là 90% chương trình Go ;-) –

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