示例代码

package main
import (
    "fmt"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request){
    hello := "Hello Wrold!"
    // 这个写入到w的是输出到客户端的
    fmt.Fprintf(w, "%s\n", hello) 
    fmt.Fprintf(w, "You are in the index\n")
}

func login(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, "You are in the login\n")
}

func home(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, "You are in the home\n")
}

func news(w http.ResponseWriter, r *http.Request){
    fmt.Fprintf(w, "You are in the news\n")
}

func main(){

    // 创建多路复用器
    mux := http.NewServeMux()

    // 将路由指向处理器
    mux.HandleFunc("/", index)
    mux.HandleFunc("/login", login)
    mux.HandleFunc("/home", home)
    mux.HandleFunc("/news", news)

    server := &http.Server{
        Addr: "0.0.0.0:9090",
        Handler: mux,
    }

    err := server.ListenAndServe()

    if err != nil{
        fmt.Println(err)
    }
}

相关说明

func index(w http.ResponseWriter, r *http.Request){
    hello := "Hello Wrold!"
    // 这个写入到w的是输出到客户端的
    fmt.Fprintf(w, "%s\n", hello) 
    fmt.Fprintf(w, "You are in the index\n")
}

这几行代码定义了一个名为index的函数(处理器),其中第一个参数为ResponseWriter接口,第二个参数为指向Request的指针

收到请求之后,index函数会先从Request中提取出相关的信息,然后创建一个http响应,最后再通过ResponseWriter接口将数据返回给客户端

其中回复的首先是一个%s,这个是格式化指示符(格式化为字符串),后面的参数hello则为这个指示符的内容,为"Hello Wrold!"\n则为换行符,换行后直接回复了另外一串字符串"You are in the index\n"

main(){
    ····
}

main函数中首先创建了一个多路复用器,然后通过一些代码将接收到的请求重定向到处理器。

net/http标准库提供了一个默认的多路复用器,这个多路复用器可以通过调用NewServeMux函数来创建:

mux := http.NewServeMux()

为了将发送至根的URL重定向到处理器,程序使用了HandleFunc函数:

mux.HandleFunc("/", index)

这个函数接受一个URL和一个处理器名字作为参数,并将针对给定URL的请求转发至指定的处理器处理。

另外,所有的处理器都接受一个ResponseWriter接口与一个指向Request结构的指针作为参数,并且所有的请求参数都可以通过访问Request结构得到,所以程序并不需要向处理器显示地传入任何请求

参考文档

1、郑兆雄 著 黄建宏 译. Go Web编程[[M]. 北京:人民邮电出版社. 2017.12:18-21,27-28

Last modification:October 28, 2019
If you think my article is useful to you, please feel free to appreciate