如何在golang建立自己的简单路由器?

如何在golang建立自己的简单路由器?,go,router,httpserver,Go,Router,Httpserver,我正在golang建立自己的路由器以理解逻辑,但是我发现404错误没有正常发现,我能够运行到服务器,但我在helloname中编写了函数,它没有运行。为什么会这样 package main import ( "fmt" "log" "net/http" "strings" "time" ) var Session *http.Server var r Router func Run(port string) { Session = &h

我正在golang建立自己的路由器以理解逻辑,但是我发现404错误没有正常发现,我能够运行到服务器,但我在helloname中编写了函数,它没有运行。为什么会这样

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")
}
主程序包
进口(
“fmt”
“日志”
“net/http”
“字符串”
“时间”
)
var会话*http.Server
var路由器
func运行(端口字符串){
会话=&http.Server{
地址:港口,
处理程序:&r,
读取超时:10*次。秒,
写入时间:10*次。秒,

MaxHeaderBytes:1您有全局变量
var r Router
,但在
func main()中创建了另一个本地变量,路径恰好只添加到其中:

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

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())
}
func main() {
    r = newRouter()
    r.Add("/hello", hello)
    Run(":8080")
}
var r=&Router{}
func运行(端口字符串){
会话=&http.Server{
地址:港口,
经办人:r,
读取超时:10*次。秒,
写入时间:10*次。秒,

MaxHeaderBytes:1您的主函数通过使用
:=
符号,声明并初始化一个名为r的新局部变量,该变量的范围不同于列表顶部的全局变量

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

解决方案是将
r路由器
声明为指向
路由器
的指针,如下所示:

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")
}