慕标琳琳
一种方法可能是利用渠道。您管理/更改需要监听的属性或变量的中央代码可能会提供一个GetChan()函数,该函数返回一个通道,在该通道上将广播修改(例如新值):// The variable or property that is listened:var i int// Slice of all listenersvar listeners []chan intfunc 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返回的通道上的循环来完成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上试用完整的程序。您还可以实现一个“代理”来实现订阅者模型并允许广播消息。