我有一个包含方法的包:
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接口。
答案 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 }
因此这不起作用。