为了账号安全,请及时绑定邮箱和手机立即绑定

go中的属性更改通知

go中的属性更改通知

Go
函数式编程 2021-09-27 17:32:54
您如何向 go 中的多个接收器发出“属性”更改信号?类似于在 Qt 中使用通知信号定义属性的方式。例如,如果您想象有一些需要以多种方式显示的值,例如可以同时显示为进度条和文本 % 的进度值,当基础值更改时,两者都需要更新。
查看完整描述

1 回答

?
慕标琳琳

TA贡献1830条经验 获得超9个赞

一种方法可能是利用渠道。


您管理/更改需要监听的属性或变量的中央代码可能会提供一个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

    }

}

并且侦听器需要“侦听”更改事件,这可以通过在由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上试用完整的程序。


您还可以实现一个“代理”来实现订阅者模型并允许广播消息。


查看完整回答
反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 156 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信