net/http 包涵盖了与 HTTP 请求发送和处理的相关代码。虽然包中定义了大量类型、函数,但最重要、最基础的概念只有两个:ServeMux 和 Handler。

ServeMux 是 HTTP 请求多路复用器(即路由器,HTTP request router),记录着请求路由表。对于每一个到来的请求,它都会比较请求路径和路由表中定义的 URL 路径,并调用指定的 handler 来处理请求。

Handler 的任务是返回一个 response 消息,并把 header 和 body 写入消息中。任何对象只要实现了 http.Handler 接口的接口方法 ServeHTTP 就可以成为 handler。ServeHTTP 的方法签名是:ServeHTTP(ResponseWriter, *Request)。

我们先通过以下代码,快速了解它们的功能:

package main

import (
    "io"
    "log"
    "net/http"
)

type myHandler struct{}

func (h *myHandler) ServeHTTP(w http.ResponseWriter, _ *http.Request) {
    io.WriteString(w, "Hello world!\n")
}

func main() {
    mux := http.NewServeMux()

    h := new(myHandler)
    mux.Handle("/foo", h)

    log.Println("Listening...")
    http.ListenAndServe(":3000", mux)
}

代码拆解如下:

  1. 首先,使用 http.NewServeMux 方法生成一个 HTTP 请求路由器。该方法内部逻辑其实是 return new(ServeMux);
  2. 然后我们创建了一个自定义 handler,功能是返回 Hello world! 文本;
  3. 接着,通过 mux.Handle 函数,将该 handler 注册到新创建的 ServeMux 对象中。这样 handler 就可以和 URL 路径 /foo 关联了;
  4. 最后,我们创建一个 server 并在 3000 端口监听请求。这里 ListenAndServe 的方法签名是 ListenAndServe(addr string, handler Handler),我们之所以可以 ServeMux 作为第二个参数,是因为 ServeMux 实现了 ServeHTTP 接口方法。

掌握了这两个概念,基本上其他概念 比如 Server,Client 类型、HandleFunc 函数作为 handler 等, 就都很好理解了。另外, 如果你对包中 HTTP 相关的概念不是很清楚的话,比如 TCP keep-alive、proxy、redirect、cookie,建议阅读《 HTTP: The Definitive Guide 》补充知识。

参考文献:A Recap of Request Handling in Go

简析 Golang net/http 包的更多相关文章

  1. 简析 Golang IO 包

    简析 Golang IO 包 io 包提供了 I/O 原语(primitives)的基本接口.io 包中定义了四个最基本接口 Reader.Writer.Closer.Seeker 用于表示二进制流的 ...

  2. JDK框架简析--java.lang包中的基础类库、基础数据类型

    题记 JDK.Java Development Kit. 我们必须先认识到,JDK不过,不过一套Java基础类库而已,是Sun公司开发的基础类库,仅此而已,JDK本身和我们自行书写总结的类库,从技术含 ...

  3. RecycleView + CardView 控件简析

    今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...

  4. Android RecycleView + CardView 控件简析

    今天使用了V7包加入的RecycleView 和 CardView,写篇简析. 先上效果图: 原理图: 这是RecycleView的工作原理: 1.LayoutManager用来处理RecycleVi ...

  5. Java Annotation 及几个常用开源项目注解原理简析

    PDF 版: Java Annotation.pdf, PPT 版:Java Annotation.pptx, Keynote 版:Java Annotation.key 一.Annotation 示 ...

  6. 简析TCP的三次握手与四次分手【转】

    转自 简析TCP的三次握手与四次分手 | 果冻想http://www.jellythink.com/archives/705 TCP是什么? 具体的关于TCP是什么,我不打算详细的说了:当你看到这篇文 ...

  7. Linux 目录结构学习与简析 Part2

    linux目录结构学习与简析 by:授客 QQ:1033553122 ---------------接Part 1-------------- #1.查看CPU信息 #cat /proc/cpuinf ...

  8. Linux 目录结构学习与简析 Part1

    linux目录结构学习与简析 by:授客 QQ:1033553122 说明: /             linux系统目录树的起点 =============== /bin      User Bi ...

  9. [Spring] 学习Spring Boot之一:基本使用及简析

    一.简介 使用 Spring Boot 目的主要是用来简化 Spring 应用的搭建及开发过程,因为使用 Spring 及 SpringMVC 框架时需要手动配置的地方非常多(各种包之间的依赖.各种配 ...

随机推荐

  1. 个人永久性免费-Excel催化剂功能第62波-单元格区域内数据加解密处理,最有效地保护数据方式

    Excel的数据保护能力有限,诸如之前提及过的工作表保护.工作薄保护等,都是十分微弱的保护措施,而对于强保护的工作薄打开密码来说,它像是个总开关一样,要么全不能看,要么就全看到.有这样的场景需求,一份 ...

  2. [leetcode] 120. Triangle (Medium)

    原题 思路: dp,从下往上依次取得最小的,取到最上面的,就是一条最小的路径. class Solution { public: int minimumTotal(vector<vector&l ...

  3. [OpenGL] 绘制并且判断凹凸多边形、自相交多边形。

    #include <iostream> #include <ctime> #include <GL/glut.h> #include <math.h> ...

  4. 【MySQL】(三)文件

    本篇文章分析构成MySQL数据库和InnoDB存储引擎表的各种累类型文件.这些文件有以下这些. 参数文件:告诉MySQL实例启动时在哪里可以找到数据库文件,并且指定某些初始化参数,这些参数定义了某种内 ...

  5. 如何使用 nvm-windows 管理 nodejs 版本

    写在前边的话: (1). 路径一定不要包含空格,如 Program Files 这样,所以有把程序安装到 D:\Program Files 文件下的同学请注意了:(2). 为了避免 nvm 无法切换源 ...

  6. ios下,微信小程序scrollview组件中的fixed元素抖得和帕金森病人一样

    问题现象 这个问题是最近在优化小程序代码时发现的. 在ios环境下,微信小程序的scrollview组件包裹着一个position:fixed的view. 当在scrollview组件上滑动时,这个v ...

  7. 【iOS】Xcode 使用 CocoaPods 导入第三方库后没有提示

    Github 上下载的开源项目,运行后出现的 [iOS]build diff: /../Podfile.lock: No such file or directory 解决后,又出现了这个问题. 解决 ...

  8. ansible-yum

    #yum 需要在vim /etc/ansible/hosts里面给执行的主机配置 远程调用python的路径不知道为什么默认值认识python2.6.6 vim /etc/ansible/hosts ...

  9. Unity基于NGUI的简单并可直接使用的虚拟摇杆实现(一)

    可能大家都听说过大名鼎鼎的easytouch,然而easytouch是基于UGUI的,两种不同的UI混用,可能会造成项目管理的混乱,并且可能会出现各种幺蛾子,比如事件传递互相扰乱的问题. 于是就想找一 ...

  10. 洛谷P2630 题解

    我先讲一下我的思路 将A,B,C,D四种操作用函数储存起来: 枚举所有可能出现的情况:A,B,C,D,AA,AB,AC,AD,BB,BC,BD,CC,CD,DD,ABC,ABD,ACD,BCD,ABC ...