函数接受抽象接口与函数接受结构实现之间的golang转换
在不同版本的实现之上创建层时遇到的一个问题。目标是抽象出实现细节,调用方不需要关心我们正在使用哪个实现 请参见代码示例 ^代码可以更好地解释我遇到的问题 我们有两个版本的流实现函数接受抽象接口与函数接受结构实现之间的golang转换,go,Go,在不同版本的实现之上创建层时遇到的一个问题。目标是抽象出实现细节,调用方不需要关心我们正在使用哪个实现 请参见代码示例 ^代码可以更好地解释我遇到的问题 我们有两个版本的流实现Stream1和Stream2。它们有一个公共接口流 它们都有相应的BindStreamHandler函数,接受StreamHandler1或StreamHandler2 我们有一个函数BindStreamHandler,以及func StreamHandlerImpl(s Stream)的一般实现。无论我们使用Strea
Stream1
和Stream2
。它们有一个公共接口流
它们都有相应的BindStreamHandler
函数,接受StreamHandler1
或StreamHandler2
我们有一个函数BindStreamHandler
,以及func StreamHandlerImpl(s Stream)
的一般实现。无论我们使用Stream1
还是Stream2
,一般实现都是相同的
现在,我面临着一个问题:向下转换StreamHandlerImpl
(接受摘要Stream
到StreamHandler1
(接受Stream1
)
更新: 我发现这很有效
但是
BindHandler
的签名变得太弱了:(我更喜欢使用签名func BindHandler(h StreamHandler)
似乎您正在尝试使用类层次结构(如Java)设计类)这并不是Go处理OO的方式。我建议您围绕接口设计代码,而不是试图模仿继承。因为我们无法推测为什么会有这样的类型,下面是一个最小的代码片段,它将使BindHandler
保持更严格的签名
func BindHandler(h StreamHandler) {
if Version == 1 {
BindStreamHandler1(func(s Stream1) {
h(s)
})
} else {
BindStreamHandler2(func(s Stream2) {
h(s)
})
}
}
非常感谢!当我阅读一些golang库代码时,我经常遇到这种“函数包装器”样式。我不知道我应该在这种情况下使用它。
func BindHandler(h StreamHandler) {
if Version == 1 {
BindStreamHandler1(func(s Stream1) {
h(s)
})
} else {
BindStreamHandler2(func(s Stream2) {
h(s)
})
}
}