Go语言http包简易入门

134 阅读1分钟

net/http

说到 go 语言 web 编程,必不可少的会使用到 net/http 包。go 语言将 web 开发需要使用到的很多内容都放在了标准库中—— net/http

如何写一个简单的web程序很容易。如下:

package main

import (
    "fmt"
    "net/http"
)

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

func main() {
    server := &http.Server{
        Addr: "0.0.0.0:8080",
    }
    http.HandleFunc("/hello", hello)
    server.ListenAndServe()
}

其中使用了 http 包。使用 http.HandleFunc 就是使用了一个处理器函数。

http.HandleFunc 和 ServerMux

处理器函数是一个签名和 ServeHTTP 方法相同的函数,Go 语言中,有一种 HandlerFunc 函数类型,可以加将这个函数转化为带有方法的处理器(Handler)?

ServerMux 是一个路由管理器,也可以说是一个多路复用器,使用方式如下:

package main

import (
    "fmt"
    "net/http"
)

func main() {
    servermux := http.NewServeMux()
    servermux.HandleFunc("/hello", hello)
    server := &http.Server{
        Addr: ":8080",
        Handler: servermux,
    }
    server.ListenAndServe()
}

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

其实是在使用 http.HandleFunc 的时候,调用了

func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {
    DefaultServeMux.HandleFunc(pattern, handler)
}

这样的话,其实是使用了一个变量 DefaultServeMux ,再看看这个变量的内容:

var DefaultServeMux = &defaultServeMux
var defaultServeMux ServeMux

这个变量其实就是 ServeMux 的实例。也就是 ServeMux ,所以在使用 httphanderfunc 的时候,是使用了这个多路复用器的。这个处理器也是默认的处理器。如果没有声明或者直接使用其他的处理器的时候,调用处理器函数和处理器都是使用了这个。

接下来看HandleFunc这个函数,以上使用的 http 包的函数 HandleFunc 最终调用的是 ServeMuxHandleFunc 。所以在使用的时候 HandleHandleFunc 完全一致。

type HandlerFunc func(ResponseWriter, *Request)

HandleFunc 最终会将函数转成 Handler,等同于 HandlerHandler 是一个接口,如下:

type Handler interface {
    ServeHTTP(ResponseWriter, *Request)
}

所以其实这两种类型是等价的。