你如何发出信号'属性'转到多个接收器?
类似于如何使用通知信号在Qt中定义属性。
E.g。如果您想象某些值需要以多种方式显示,例如可以同时显示为进度条和文本%的进度值,其中两者都需要在基础值更改时更新。
答案 0 :(得分:3)
一种方法是利用channels。
管理/更改需要侦听的属性或变量的中央代码可以提供GetChan()
函数,该函数返回将广播修改(例如新值)的通道:
// 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
}
}
听众需要&#34;听&#34;对于更改事件,可以通过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上尝试完整的程序。
您也可以实施&#34;经纪人&#34;它实现了用户模型并允许广播消息。请参阅How to broadcast message using channel。