簡體   English   中英

go中的財產變更通知

[英]Property change notification in go

如何在go中向多個接收器發出“屬性”變化的信號?

類似於如何使用通知信號在Qt中定義屬性。

例如,如果您想象某些值需要以多種方式顯示,例如可以顯示為進度條和文本%的進度值,其中兩者都需要在基礎值更改時更新。

一種方法是利用渠道

管理/更改需要監聽的屬性或變量的中央代碼可以提供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
    }
}

並且偵聽器需要“監聽”更改事件,這可以通過GetChan()返回的通道上的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上嘗試完整的程序。

您還可以實現“代理”,其實現訂戶模型並允許廣播消息。 請參見如何使用頻道廣播消息

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM