Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/420.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
函数接受抽象接口与函数接受结构实现之间的golang转换_Go - Fatal编程技术网

函数接受抽象接口与函数接受结构实现之间的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)
        })
    }
}