我正在尋找訂閱 Go 中屬性更改的解決方案。鑒于以下結(jié)構(gòu),我想實(shí)現(xiàn)一個(gè)派生屬性,該屬性訂閱其源屬性,并且只有在被讀取時(shí)它才會(huì)重新評(píng)估自身。如果一個(gè)或多個(gè)來(lái)源發(fā)生變化,它會(huì)通過(guò)收到通知或通過(guò)檢查“臟標(biāo)志”(頻道?)來(lái)知道這樣做。 編輯:我不是在尋找一個(gè)“getter”函數(shù),它不會(huì)緩存獲取的值,而是在每次讀取它們時(shí)提取它們)。另請(qǐng)參閱下面添加的 DeriveAndSubscribe 方法,說(shuō)明派生的 FullName 會(huì)做什么)。我想這類似于一個(gè)相當(dāng)?shù)湫偷陌咐?。下面的例子:type Person struct { /FullName string // Derived, from the two below: FirstName string // persistent LastName string // persistent}對(duì)于遠(yuǎn)訂閱/獲取,該概念也必須是“可見(jiàn)的”,例如,從底層 Person 對(duì)象派生其詳細(xì)用戶信息的 User 對(duì)象:type User struct { person *Person /FullName string // Derived from person.FullName above}(好吧,人們的名字不會(huì)經(jīng)常更改,但示例必須很簡(jiǎn)單)。我自己對(duì)此的第一個(gè)想法是,Pull - 派生屬性 (FullName) 是“惰性的”(僅在有人閱讀它/它們時(shí)才進(jìn)行評(píng)估)。因此,僅在評(píng)估 Fullname 字符串時(shí)才“拉取”任何訂閱(“臟”標(biāo)志/通知)似乎是最自然的,即“詢問(wèn)”是否發(fā)生了任何更改。緩存- 派生該值后,將其存儲(chǔ)在(隱藏)字段 (_fullName) 中,以便該字符串可以在下次讀取時(shí)重用,如果其訂閱值未更改。延遲訂閱- 當(dāng)有人讀取 FullName 屬性時(shí),不僅派生操作應(yīng)該是“延遲的”,而且訂閱本身應(yīng)該只在第一次評(píng)估時(shí)(當(dāng)有人讀取屬性時(shí))放置。使用 pull而不是 push 的充分理由似乎是,當(dāng)?shù)讓訉傩愿臅r(shí),訂閱屬性可能存在也可能不存在。如果源中沒(méi)有“發(fā)送列表”,那么如果/當(dāng)最終訂閱屬性/對(duì)象消失時(shí),則無(wú)需“取消注冊(cè)”。并進(jìn)一步; 在分布式場(chǎng)景中(不同機(jī)器上的用戶和人員),最好僅在實(shí)際明確要求數(shù)據(jù)時(shí)才更新內(nèi)容(訂閱也適用,只能在第一次讀取 FullName 時(shí)放置)。豪華是如果夠程(可選)可以更新(重新評(píng)估)FullName的屬性(S)時(shí),CPU是不是很忙,而重新評(píng)估將被立即執(zhí)行,如果有人讀FullName的屬性(既可以在一個(gè)解決方案可以實(shí)現(xiàn)嗎?) .無(wú)論如何,這里是需要鋪設(shè)的訂閱(ASCII 模型):[Person]./FullName --> [Person].FirstName // Subscribe 1 [Person].LastName // Subscribe 2和[User]./FullName --> [User].person./FullName // Subscribe 3也就是說(shuō),總共有三 (3) 個(gè)訂閱來(lái)保持 User.FullName 屬性的更新。(暫時(shí)忽略 [User].person-link)。可以使用渠道來(lái)實(shí)現(xiàn)這樣的事情嗎,如果可以,嗯……怎么做?在插入了隱藏字段的上述結(jié)構(gòu)下方(用于緩存派生結(jié)果,直到下一次源屬性變得“臟”):type Person struct { /FullName string // Derived _fullName string // "cache" FirstName string LastName string }和:type User struct { person *Person /FullName string // Derived _fullName string // "cache"}
- 2 回答
- 0 關(guān)注
- 195 瀏覽
添加回答
舉報(bào)
0/150
提交
取消