函数接受抽象接口和函数接受struct实现之间的golang转换

时间:2018-12-01 07:32:35

标签: go

在不同版本的实现之上创建层时遇到的一个问题。目的是抽象出实现细节,并且调用者无需关心我们使用的是哪种实现。

请参见代码示例here

^该代码可以更好地解释我遇到的问题。

我们有两个版本的Stream实现Stream1Stream2。它们具有公共接口Stream

它们两个都有对应的BindStreamHandler函数,可以接受StreamHandler1StreamHandler2

我们有一个函数BindStreamHandler和一个func StreamHandlerImpl(s Stream)的常规实现。无论我们使用Stream1还是Stream2,总体实现都是相同的。

现在,我面临着一个问题,即将StreamHandlerImpl下调(接受抽象StreamStreamHandler1(接受Stream1)。


更新:

我发现this version有用。

func BindHandler(h interface{}) {
    if Version == 1 {
        h1 := h.(StreamHandler1)
        BindStreamHandler1(h1)
    } else {
        h2 := h.(StreamHandler2)
        BindStreamHandler2(h2)
    }
}

但是BindHandler的签名变得太弱了:(我更喜欢使用签名func BindHandler(h StreamHandler)

1 个答案:

答案 0 :(得分:1)

似乎您正在尝试使用类层次结构(例如Java)来设计类,而这实际上并不是Go处理OO的方式。我真的建议您围绕接口设计代码,而不要尝试模仿继承。由于我们无法推测为什么会有这种类型,因此下面是一个最小的代码段,它将使BindHandler保持更严格的签名。

func BindHandler(h StreamHandler) {
    if Version == 1 {
        BindStreamHandler1(func(s Stream1) {
            h(s)
        })
    } else {
        BindStreamHandler2(func(s Stream2) {
            h(s)
        })
    }
}

Playground