【问题标题】:How to build routes with structs/interfaces?如何使用结构/接口构建路由?
【发布时间】:2018-06-09 02:07:10
【问题描述】:

我在博客上看到了一个方法,并决定尝试让它工作,到目前为止我一直没有成功。我正在尝试使用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/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

知道如何解决这个问题吗?

【问题讨论】:

  • 文档How to Write Go Code 解释了您可能遗漏的一些概念。
  • 感谢您的链接;是的,我对 Go 还很陌生。虽然不能解决我的问题。
  • 该文档直接讨论了如何从另一个包中引用一个包。您需要在 router.go 中导入“控制器”,并将接口称为controllers. ControllerInterfaceGet。哦,答案是这样的。进行此更改后是否出现错误?
  • 哦,我明白了。很抱歉造成混乱:)

标签: go


【解决方案1】:

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

【讨论】:

  • 好的,有道理。然而,这并不能解决未定义的错误。
  • 抱歉让您感到困惑 - 这确实解决了问题!
猜你喜欢
  • 2011-02-22
  • 1970-01-01
  • 2012-03-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-24
  • 2013-01-30
相关资源
最近更新 更多