gpt4 book ai didi

go - go 中的属性更改通知

转载 作者:IT王子 更新时间:2023-10-29 01:02:58 25 4
gpt4 key购买 nike

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

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

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

最佳答案

一种方法可能是利用 channels .

管理/更改需要监听的属性或变量的中央代码可能会提供一个 GetChan() 函数,该函数返回一个 channel ,在该 channel 上广播修改(例如新值):

// 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
}
}

并且监听器需要“监听”更改事件,这可以通过 GetChan() 返回的 channel 上的 for range 循环来完成:

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 上试用完整的程序.

您还可以实现一个实现订阅者模型并允许广播消息的“代理”。参见 How to broadcast message using channel .

关于go - go 中的属性更改通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29488010/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com