如何在golang中间接传递接口

时间:2015-05-29 11:53:11

标签: go

我有一个包含方法的包:

func Route(router *mux.Router){
    subrouter := router.PathPrefix(_API).Subrouter()
    subrouter.Path(_FOO).HandlerFunc(foo)
    subrouter.Path(_BAR).HandlerFunc(bar)
}

我希望通过在我的包中使用匹配的接口来删除mux的外部依赖性,该接口简单地包含上面使用的所有功能,如下所示:

type Router interface{
    Path(string) Path
    PathPrefix(string) Path
}

type Path interface{
    HandlerFunc(http.HandlerFunc)
    Subrouter() Router
}

func Route(router Router){
    subrouter := router.PathPrefix(_API).Subrouter()
    subrouter.Path(_FOO).HandlerFunc(foo)
    subrouter.Path(_BAR).HandlerFunc(bar)
}

但是当我构建这个时,我得到错误:

  

* mux.Router没有实现api.Router(Path方法的类型错误)                有路径(字符串)* mux.Route                想要路径(字符串)api.Path

但我认为接口是在golang中隐式使用的,所以我认为*mux.Route确实实现了我的Path接口。

1 个答案:

答案 0 :(得分:5)

  

我认为接口是在golang中隐式使用的

值隐式包含在接口中,但仅限于特定情况,例如将实现传递给带有interface参数的函数时:

func X(api.Path) {}

X(&mux.Route{}) // works, implicitly converted to api.Path

或从具有接口返回类型的函数返回实现时:

func Y() api.Path {
    return &mux.Route{} // works, implicitly converted to api.Path
}

在您的问题中,编译器需要一个具有签名方法的值:

Path(string) api.Path

但是你用一个带签名的方法给它一个值:

Path(string) *mux.Route

就像你现在一样,Go类型是不变的。正式:

type A interface { Path(string) *mux.Route }

不是

的子类型
type B interface { Path(string) api.Path }

因此这不起作用。