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. NOIp2018普及组T3暨洛谷P5017 摆渡车:题解

    题目链接:https://www.luogu.org/problemnew/show/P5017 emm,这次的真的不简单的,T3比T4难? 醉了... 蒟蒻肯定没有其他大佬讲的好啊,但肯定尽力,真的 ...

  2. drop、truncate和delete的区别 [转载]

    drop.truncate和delete的区别 本文转载自: https://www.cnblogs.com/zhizhao/p/7825469.html     (1)DELETE语句执行删除的过程 ...

  3. 个人永久性免费-Excel催化剂功能第98波-零代码零距离轻松接触并拥有金融大数据

    数据产生价值的一个最突出的领域-金融领域,股票.证券.上市公司财务报表等,多少人在其中发掘出宝贵的数据价值.今天Excel催化剂联合Tushare金融大数据平台,让这一切的数据都能成为你我普通人零代码 ...

  4. 人民网基于FISCO BCOS区块链技术推出“人民版权”平台

    FISCO BCOS是完全开源的联盟区块链底层技术平台,由金融区块链合作联盟(深圳)(简称金链盟)成立开源工作组通力打造.开源工作组成员包括博彦科技.华为.深证通.神州数码.四方精创.腾讯.微众银行. ...

  5. js - 原生ajax访问后台读取数据并显示在页面上

    1.前台调用ajax访问后台方法,并接收数据 <%@ page contentType="text/html;charset=UTF-8" language="ja ...

  6. 或许是你应该了解的一些 ASP.NET Core Web API 使用小技巧

    一.前言 在目前的软件开发的潮流中,不管是前后端分离还是服务化改造,后端更多的是通过构建 API 接口服务从而为 web.app.desktop 等各种客户端提供业务支持,如何构建一个符合规范.容易理 ...

  7. Java1.8新特性实战

    public class JDK8_features {private ArrayList<Integer> list; @Testpublic void test(){/*** 1.La ...

  8. 【python-django后端开发】Redis缓存配置使用详细教程!!!

    官方查阅资料:https://django-redis-chs.readthedocs.io/zh_CN/latest/ 1. 安装django-redis扩展包 1.安装django-redis扩展 ...

  9. 新IT运维时代 | Docker运维之最佳实践-下篇

    上篇针对操作系统.主机配置.容器镜像.容器运行时四大方面分享一些Docker的运维经验,本篇将着重在Docker Daemon参数和权限两个方面进一步分享.(阅读上篇请点击右侧:新IT运维时代 | D ...

  10. redis分布式锁&队列应用

    分布式锁 setnx(set if not exists) 如果设值成功则证明上锁成功,然后再调用del指令释放. // 这里的冒号:就是一个普通的字符,没特别含义,它可以是任意其它字符,不要误解 & ...