30

我一直在研究 golang,我注意到很多人使用该http.NewServeMux()功能创建服务器,但我并不真正了解它的作用。

我读到这个:

在 go ServeMux 中是一个 HTTP 请求多路复用器。它将每个传入请求的 URL 与已注册模式列表进行匹配,并为与 URL 最匹配的模式调用处理程序。

这与仅执行以下操作有何不同:

http.ListenAndServe(addr, nil)
http.Handle("/home", home)
http.Handle("/login", login)

使用多路复用的目的是什么?

4

2 回答 2

15

来自net/httpGoDoc 和 Source。

ListenAndServe starts an HTTP server with a given address and handler. The handler is usually nil, which means to use DefaultServeMux. Handle and HandleFunc add handlers to DefaultServeMux

DefaultServeMux只是一个预定义的http.ServeMux

var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux

正如您在内部看到的http.Handle那样DefaultServeMux

func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) }

的目的http.NewServeMux()是拥有您自己的实例,http.ServerMux例如当您需要两个http.ListenAndServe函数侦听具有不同路由的不同端口时。

于 2016-11-08T06:11:58.517 回答
6

Golang 中的多路复用器类似于硬件中的多路复用器,它将一些输入乘以一些输出

我给你一个简单的例子

type CustomMultiplexer struct {
}

给定的多路复用器必须实现将ServeHTTPint http 注册到服务器输入的方法

func (mux CustomMultiplexer) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    if r.URL.Path == "/" {
        SimpleRequestHandler(w, r)
        return
    }
    http.NotFound(w, r)
    return
}

SimpleRequestHandler的方法如下

func SimpleRequestHandler(w http.ResponseWriter, r *http.Request) {
    switch r.Method {
    case http.MethodGet:
        mySimpleGetRequestHandler(w, r)
        break
    default:
        http.Error(w, "method not allowed", http.StatusMethodNotAllowed)
        break
    }
}

现在我可以使用 myCustomMultiplxere在传入请求之间进行多路复用

func main() {
    customServer := CustomServer{}
    err := http.ListenAndServe(":9001", &customServer)
    if err != nil {
        panic(err)
    }
}

http.HandleFunc方法作为我给定的简单多路复用器工作。

于 2020-02-05T18:34:37.303 回答