博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
golang http 服务器的接口梳理
阅读量:5142 次
发布时间:2019-06-13

本文共 3679 字,大约阅读时间需要 12 分钟。

golang http 服务器的接口梳理

Hanlde和HandleFunc以及Handler, HandlerFunc
func Handle(pattern string, handler Handler)// Handle 函数将pattern和对应的handler注册进DefaultServeMuxfunc HandleFunc(pattern string, handler func(ResponseWriter, *Request))// HandleFunc registers the handler function for the given pattern in the DefaultServeMux// Handler// type Handler interface {    ServeHTTP(ResponseWriter, *Request)}// HandlerFunc能够将一个普通的处理函数转化为Handlertype HandlerFunc func(ResponseWriter, *Request)

HandleFunc仅接受一个func为参数,相对于简洁些。Handle则需要传入一个带有ServeHTTP的结构体,因此控制逻辑可以灵活些。

Handle的例子

package mainimport (    "fmt"    "log"    "net/http"    "sync")type countHandler struct {    mu  sync.Mutex // guards n    n   int}func (h *countHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {    h.mu.Lock()    defer h.mu.Unlock()    h.n++    fmt.Fprintf(w, "count is %d\n", h.n)}func main() {    http.Handle("/count", new(countHandler))    log.Fatal(http.ListenAndServe(":8080", nil))}
HandleFunc的例子
h1 := func(w http.ResponseWriter, _ *http.Request) {    io.WriteString(w, "Hello from a HandleFunc #1!\n")}h2 := func(w http.ResponseWriter, _ *http.Request) {    io.WriteString(w, "Hello from a HandleFunc #2!\n")}http.HandleFunc("/", h1)http.HandleFunc("/endpoint", h2)log.Fatal(http.ListenAndServe(":8080", nil))
ListenAndServe
// 监听TCP然后调用handler对应的Serve去处理请求。handler默认为nil,则使用DefaultServeMuxfunc ListenAndServe(addr string, handler Handler) error
ServeMux

路由调度器,根据请求url调用handler去处理。实现了Handle,HandleFunc方法。

ServeMux实现了ServeHTTP因此也是一个Handler接口

// 新建func NewServeMux() *ServeMux// 方法func (mux *ServeMux) ServeHTTP(w ResponseWriter, r *Request)func (mux *ServeMux) Handle(pattern string, handler Handler)func (mux *ServeMux) HandleFunc(pattern string, handler func(ResponseWriter, *Request))func (mux *ServeMux) Handler(r *Request) (h Handler, pattern string)// mux := http.NewServeMux()mux.Handle("/api/", apiHandler{})mux.HandleFunc("/", func(w http.ResponseWriter, req *http.Request) {    // The "/" pattern matches everything, so we need to check    // that we're at the root here.    if req.URL.Path != "/" {        http.NotFound(w, req)        return    }    fmt.Fprintf(w, "Welcome to the home page!")})
Server 类型
type Server struct {    Addr    string  // TCP address to listen on, ":http" if empty    Handler Handler // handler to invoke, http.DefaultServeMux if nil    TLSConfig *tls.Config    ReadTimeout time.Duration    ReadHeaderTimeout time.Duration    WriteTimeout time.Duration    IdleTimeout time.Duration    MaxHeaderBytes int    TLSNextProto map[string]func(*Server, *tls.Conn, Handler)    ConnState func(net.Conn, ConnState)    ErrorLog *log.Logger    // contains filtered or unexported fields}// 方法func (srv *Server) Close() errorfunc (srv *Server) ListenAndServe() errorfunc (srv *Server) ListenAndServeTLS(certFile, keyFile string) errorfunc (srv *Server) RegisterOnShutdown(f func())func (srv *Server) Serve(l net.Listener) errorfunc (srv *Server) ServeTLS(l net.Listener, certFile, keyFile string) errorfunc (srv *Server) SetKeepAlivesEnabled(v bool)func (srv *Server) Shutdown(ctx context.Context) error

可以通过Server类型来改变默认的Server配置,如改变监听端口等。

func main(){    http.HandleFunc("/", index)    server := &http.Server{        Addr: ":8000",        ReadTimeout: 60 * time.Second,        WriteTimeout: 60 * time.Second,    }    server.ListenAndServe()}// 自定义的serverMux对象也可以传到server对象中。func main() {    mux := http.NewServeMux()    mux.HandleFunc("/", index)    server := &http.Server{        Addr: ":8000",        ReadTimeout: 60 * time.Second,        WriteTimeout: 60 * time.Second,        Handler: mux,    }    server.ListenAndServe()}

转载于:https://www.cnblogs.com/linyihai/p/10847562.html

你可能感兴趣的文章
我对于脚本程序的理解——百度轻应用有感
查看>>
面试时被问到的问题
查看>>
spring 事务管理
查看>>
VS2008 去掉msvcr90的依赖
查看>>
当前记录已被另一个用户锁定
查看>>
Node.js 连接 MySQL
查看>>
那些年,那些书
查看>>
注解小结
查看>>
java代码编译与C/C++代码编译的区别
查看>>
Bitmap 算法
查看>>
转载 C#文件中GetCommandLineArgs()
查看>>
list control控件的一些操作
查看>>
LVM快照(snapshot)备份
查看>>
绝望的第四周作业
查看>>
一月流水账
查看>>
npm 常用指令
查看>>
判断字符串在字符串中
查看>>
Linux环境下Redis安装和常见问题的解决
查看>>
HashPump用法
查看>>
cuda基础
查看>>