go - 如何在 golang 中构建自己的简单路由器?

标签 go router httpserver

我在 golang 中构建自己的路由器以理解逻辑,但是我收到 404 错误,通常找不到,我能够运行到服务器但是我在 hello 名称中编写了函数,它没有运行。这是什么原因?

package main
import (
    "fmt"
    "log"
    "net/http"
    "strings"
    "time"
)

var Session *http.Server
var r Router

func Run(port string) {
    Session = &http.Server{
        Addr:           port,
        Handler:        &r,
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }
    log.Fatal(Session.ListenAndServe())
}

type Handle func(http.ResponseWriter, *http.Request)

type Router struct {
    mux map[string]Handle
}

func newRouter() *Router {
    return &Router{
        mux: make(map[string]Handle),
    }
}

func (r *Router) Add(path string, handle Handle) {
    r.mux[path] = handle
}

func GetHeader(url string) string {
    sl := strings.Split(url, "/")
    return fmt.Sprintf("/%s", sl[1])
}

func (rt *Router) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    head := GetHeader(r.URL.Path)
    h, ok := rt.mux[head]
    if ok {
        h(w, r)
        return
    }
    http.NotFound(w, r)
}

func hello(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintf(w, "%s", "hello world")
}

func main() {
    r := newRouter()
    r.Add("/hello", hello)
    Run(":8080")
}

最佳答案

您的主函数通过使用 := 表示法声明并初始化一个名为 r 的新局部变量,其作用域不同于您列表顶部的全局变量。

这意味着您要添加处理程序的 r 变量不是您尝试分配给 Http.Server 结构的全局变量,因此您的 ServeHTTP 根本找不到任何映射到它自己的接收器 r 中。

一种解决方案是将 r Router 声明为指向 Router 的指针,如下所示:

var r *Router

并且在您的处理程序中,您可以直接传递指针而无需任何取消引用:

Session = &http.Server{
        Addr:           port,
        Handler:        r,
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }

当然,请记住通过分配指针值而不是声明一个新的本地变量来初始化变量:

func main() {
    r = newRouter()
    r.Add("/hello", hello)
    Run(":8080")
}

关于go - 如何在 golang 中构建自己的简单路由器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40070168/

相关文章:

go - 如何使用Go在ejabberd中创建账户和添加/删除好友?

arrays - 去 : how to Assign all elements in 2 by 2 array of variable size?

docker - 即使容器在 docker 中映射了端口,也从服务器获取空响应

go:需要更新 go.mod;更新它:

string - Golang 中 Big Ints 前导零填充的 Format 方法的使用示例

iphone - 获取路由器范围内设备的MAC地址

node.js - 如何使用 Express 和 Node 仅在 POST 上添加中间件

vue.js - 将来自 URL 的参数与 Vue 路由器配置中的 props 对象结合起来

c++ - 窗口 HTTP IO 完成端口

http - 发送带参数的GET请求得到301状态码