/images/hugo/avatar.png

go 网络库 net/http 的请求处理过程

1. net/http 库结构

我们先来看一个最简单的 http server:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
package web

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

func StartWebServer() {
	http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprintf(w, "hello, %q", "tsong")
	})
	http.ListenAndServe(":8080", nil)
}

// net/http 库
func ListenAndServe(addr string, handler Handler) error {
	server := &Server{Addr: addr, Handler: handler}
	return server.ListenAndServe()
}

显然启动一个 http server,我们需要:

httprouter

1. httprouter 简介

go 网络库 net/http 的请求处理过程 中我们了解了标准库 net/http 的请求处理流程。net/http 中提供了一个默认的路由实现 ServeMux,通过一个 map 能实现 url 到 handler 的映射,功能较为简单。第三方库 httprouter 已经成为事实上 router 的实现标准。大多数 web 框架的路由实现都是基于 httprouter,所以今天我们就来看看 httprouter 的实现。

go 数据格式转换

1. json

2. yaml

3. ini

4. binary

标准库提供的binary包直接读写抽象数据类型实例。binary 只支持采用定长表示的抽象数据类型。

5. gob

gob包也是Go标准库提供的一个序列化/反序列化方案,和JSON、XML等序列化/反序列化方案不同,它的API直接支持读写实现了io.Reader和io.Writer接口的实例。

go 文本操作

1. 字符操作

strings 和 bytes 提供了 go 语言中的字符操作,因为还不不支持泛型,所以这两个包提供了几乎一样的函数和类型,区别仅仅在于一个操作 string,其中大致可分为如下几类:

go time

1. 时间基础操作

1.1 时间的表示

获取当前时间可以使用 time.Now(),Now 返回的是 Time 结构的结构,Time 是对即时时间的抽象。time.Time的结构如下: