1 回答

TA貢獻1830條經(jīng)驗 獲得超9個贊
一種方法可能是利用渠道。
您管理/更改需要監(jiān)聽的屬性或變量的中央代碼可能會提供一個GetChan()函數(shù),該函數(shù)返回一個通道,在該通道上將廣播修改(例如新值):
// The variable or property that is listened:
var i int
// Slice of all listeners
var listeners []chan int
func GetChan() chan int {
listener := make(chan int, 5)
listeners = append(listeners, listener)
return listener
}
每當您更改變量/屬性時,您都需要廣播更改:
func Set(newi int) {
i = newi
for _, ch := range listeners {
ch <- i
}
}
并且偵聽器需要“偵聽”更改事件,這可以通過在由for range返回的通道上的循環(huán)來完成GetChan():
func Background(name string, ch chan int, done chan int) {
for v := range ch {
fmt.Printf("[%s] value changed: %d\n", name, v)
}
done <- 0
}
下面是主程序:
func main() {
l1 := GetChan()
l2 := GetChan()
done := make(chan int)
go Background("B1", l1, done)
go Background("B2", l2, done)
Set(3)
time.Sleep(time.Second) // Wait a little
Set(5)
// Close all listeners:
for _, listener := range listeners {
close(listener)
}
// Wait 2 background threads to finish:
<-done
<-done
}
它的輸出:
[B1] value changed: 3
[B2] value changed: 3
[B1] value changed: 5
[B2] value changed: 5
您可以在Go Playground上試用完整的程序。
您還可以實現(xiàn)一個“代理”來實現(xiàn)訂閱者模型并允許廣播消息。
- 1 回答
- 0 關(guān)注
- 177 瀏覽
添加回答
舉報