【发布时间】:2022-10-24 10:38:52
【问题描述】:
我写了一些创建“人类”的代码。人类每 100 毫秒过一次生日,您可以像这样订阅事件:
pers1 := new(Human)
pers1.Init("John")
pers1.Subscribe(func(h Human) { fmt.Printf("Observer1 : %s", h.String()); return })
pers1.Subscribe(func(h Human) { fmt.Printf("Observer2 : %s", h.String()); return })
time.Sleep(3 * time.Second)
输出如下
HUMAN John is born // by init
HUMAN John is now followed by 0x4901a0 // by subscribe
There is now 1 observers
HUMAN John is now followed by 0x490300 // by subscribe
There is now 2 observers
[T+0100ms]
HUMAN John has its birthday // after 100ms : birthday happens
Observer1 : HUMAN : John is 1 // callback
Observer2 : HUMAN : John is 1 // callback
// ... continue for 3 seconds
详细代码在这里,但问题不存在 https://goplay.tools/snippet/7qsZ1itcqrS
我的问题如下:
我想创建一个界面制片人对应于产生我可以订阅的事件的事物。
您可以订阅:
- 过生日的人
- 可以检测湿度变化的湿度传感器
- 收到邮件的邮件服务器...
在我的示例中,回调函数作为参数:人类.年龄变了的那个……
以相同的方式,湿度传感器的给定事件将期望传感器结构。
我的问题是
- 我认为这样做有道理吗? (这是一个学者问题,没有东西可以工作)
- 如果是,如何。我找不到相关的例子
那将是
type Producer interface{
Subscribe( func( < something variable >) )
}
我无法得到一些工作。 我也很难为这个问题找到一个好的标题。随意给我一个更好的。
【问题讨论】:
-
您唯一可以使用的是
any,这将迫使您进行丑陋的反思。或者:想出一个通用的接口。 -
Go 1.18+ 有泛型(也就是类型参数)。不会在
Producer接口类型帮助中添加类型参数吗? -
您可以使用带有类型参数的接口,但这是否有用取决于您想用它做什么。如果您只想抽象行为,则可以使用带有类型参数的结构
标签: go