代码之家  ›  专栏  ›  技术社区  ›  P. Nick

如何用结构/接口构建路由?

go
  •  0
  • P. Nick  · 技术社区  · 6 年前

    我在博客上看到了一个方法,并决定尝试让它发挥作用,到目前为止,我还没有成功。我想和 gorilla/mux 和结构/接口。这里的主要问题是,当结构作为函数参数传递时,我无法访问接口。

    主要任务:

    package main
    
    import (
        router "routers/web"
    )
    
    func main() {
        router.Serve()
    }
    

    路由器/路由器.go

    package router
    
    import (
        "net/http"
    
        "github.com/gorilla/mux"
    )
    
    func Route(path string, ct interface{}) {
        r := mux.NewRouter()
    
        //ct prints {Controller:{ControllerInterfaceGet:<nil>}}
    
        if c, ok := ct.(ControllerInterfaceGet); ok {
            r.HandleFunc(path, http.HandlerFunc(c.Get)).Methods("GET")
        }
    }
    
    func Init() {
        http.ListenAndServe(":8080", nil)
    }
    

    路由器/web/web.go:

    package routerweb
    
    import (
        "controllers/web"
        "routers"
    )
    
    func Serve() {
        router.Route("/", webtest.TestController{})
    
        router.Init()
    }
    

    控制器/控制器.go:

    package controllers
    
    import (
        "net/http"
    )
    
    type Controller struct {
        ControllerInterfaceGet
    }
    
    type ControllerInterfaceGet interface {
        Get(w http.ResponseWriter, r *http.Request)
    }
    

    最后是特定路线的控制器:

    package webtest
    
    import (
        "controllers"
        "net/http"
    )
    
    type TestController struct {
        controllers.Controller
    }
    
    func (p TestController) Get(w http.ResponseWriter, r *http.Request) {
        println("Hello World")
    }
    

    我已经做了一些调试,每当我试图编译它时,它都会给出以下错误:

    # routers
    .\router.go:14:18: undefined: ControllerInterfaceGet
    

    知道怎么解决这个问题吗?

    1 回复  |  直到 6 年前
        1
  •  1
  •   MarStr    6 年前

    controllers.ControllerInterfaceGet