go中的属性更改通知

您如何向 go 中的多个接收器发出“属性”更改信号?

类似于在 Qt 中使用通知信号定义属性的方式。

例如,如果您想象有一些需要以多种方式显示的值,例如可以同时显示为进度条和文本 % 的进度值,当基础值更改时,两者都需要更新。


函数式编程
浏览 158回答 1
1回答

慕标琳琳

一种方法可能是利用渠道。您管理/更改需要监听的属性或变量的中央代码可能会提供一个GetChan()函数,该函数返回一个通道,在该通道上将广播修改(例如新值):// The variable or property that is listened:var i int// Slice of all listenersvar listeners []chan intfunc GetChan() chan int {&nbsp; &nbsp; listener := make(chan int, 5)&nbsp; &nbsp; listeners = append(listeners, listener)&nbsp; &nbsp; return listener}每当您更改变量/属性时,您都需要广播更改:func Set(newi int) {&nbsp; &nbsp; i = newi&nbsp; &nbsp; for _, ch := range listeners {&nbsp; &nbsp; &nbsp; &nbsp; ch <- i&nbsp; &nbsp; }}并且侦听器需要“侦听”更改事件,这可以通过在由for range返回的通道上的循环来完成GetChan():func Background(name string, ch chan int, done chan int) {&nbsp; &nbsp; for v := range ch {&nbsp; &nbsp; &nbsp; &nbsp; fmt.Printf("[%s] value changed: %d\n", name, v)&nbsp; &nbsp; }&nbsp; &nbsp; done <- 0}下面是主程序:func main() {&nbsp; &nbsp; l1 := GetChan()&nbsp; &nbsp; l2 := GetChan()&nbsp; &nbsp; done := make(chan int)&nbsp; &nbsp; go Background("B1", l1, done)&nbsp; &nbsp; go Background("B2", l2, done)&nbsp; &nbsp; Set(3)&nbsp; &nbsp; time.Sleep(time.Second) // Wait a little&nbsp; &nbsp; Set(5)&nbsp; &nbsp; // Close all listeners:&nbsp; &nbsp; for _, listener := range listeners {&nbsp; &nbsp; &nbsp; &nbsp; close(listener)&nbsp; &nbsp; }&nbsp; &nbsp; // Wait 2 background threads to finish:&nbsp; &nbsp; <-done&nbsp; &nbsp; <-done}它的输出:[B1] value changed: 3[B2] value changed: 3[B1] value changed: 5[B2] value changed: 5您可以在Go Playground上试用完整的程序。您还可以实现一个“代理”来实现订阅者模型并允许广播消息。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go