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

时间:2018-06-09 02:07:11

标签: go

我在博客上看到了一种方法,并决定尝试使其工作,到目前为止我一直没有成功。我尝试使用gorilla/mux和结构/接口创建路由。这里的主要问题是当结构作为函数参数传递时,我无法访问接口。

main.go:

package main

import (
    router "routers/web"
)

func main() {
    router.Serve()
}

路由器/ router.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.go:

package routerweb

import (
    "controllers/web"
    "routers"
)

func Serve() {
    router.Route("/", webtest.TestController{})

    router.Init()
}

控制器/ controller.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 个答案:

答案 0 :(得分:1)

您遇到的直接问题是两者都在不同的包中。您应该将其称为controllers.ControllerInterfaceGet