golang 结构的双向绑定

Two-way-binding for golang structs

TLDR: 我可以在 golang 中注册回调函数以便在结构成员更改时得到通知吗?


我想在 go 服务器和 angular 客户端之间创建一个简单的双向绑定。通信是通过 websockets 完成的。

示例:

开始:

type SharedType struct {
    A int
    B string
}
sharedType := &SharedType{}
...
sharedType.A = 52

JavaScript:

var sharedType = {A: 0, B: ""};
...
sharedType.A = 52;

想法:

在这两种情况下,修改值后,我想触发自定义回调函数,通过websocket发送消息,并相应地更新client/server端的值。

发送的消息应仅说明更改了哪个值(key / index)以及新值是什么。它还应该支持嵌套类型(结构,包含其他结构)而不需要传输所有内容。

在客户端(angular),我可以通过注册一个回调函数来检测JavaScript个对象的变化。

在服务器端 (golang),我可以创建自己的 map[]slice[] 实现来在每次修改成员时触发回调(参见 Cabinet class 在这个例子中:https://appliedgo.net/generics/)。

在这些回调函数中,我可以将修改后的数据发送到另一端,因此地图和切片的双向绑定是可能的。

我的问题:

我想避免像

这样的事情
sharedType.A = 52
sharedType.MemberChanged("A")
// or:
sharedType.Set("A", 52) //.. which is equivalent to map[], just with a predifined set of allowed keys

如果结构成员被修改,golang 中有没有什么方法可以得到通知?或者是否有任何其他通用方法可以轻松进行双向绑定而无需大量样板代码?

不,这不可能。


但真正的问题是:你打算如何在你的 Go 程序中使用所有这些魔法?

想想你想要的东西确实是可能的。 现在是一个无辜的任务

v.A = 42

除其他事项外,会触发发送内容 通过 websocket 连接到客户端。

现在如果连接关闭(客户端断开连接)会发生什么, 发送失败? 如果在截止日期前未能完成发送会怎样?

好的,假设您至少部分正确并且只有在发送成功时才会对本地字段进行实际修改。 不过,发送错误应该如何处理?

说,如果

中的第三个赋值会发生什么
 v.A = 42
 v.B = "foo"
 v.C = 1e10-23

失败了?