Go语言net/http包解析

首先来看一个用net/http包写的web服务器:两个函数实现http服务器

package main

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

func sayhelloName(w http.ResponseWriter, r *http.Request) {
	r.ParseForm()  //解析参数,默认是不会解析的
	fmt.Println(r.Form)  //这些信息是输出到服务器端的打印信息
	fmt.Println("path", r.URL.Path)
	fmt.Println("scheme", r.URL.Scheme)
	fmt.Println(r.Form["url_long"])
	for k, v := range r.Form {
		fmt.Println("key:", k)
		fmt.Println("val:", strings.Join(v, ""))
	}
	fmt.Fprintf(w, "Hello world!") //这个写入到w的是输出到客户端的
}

func main() {
	http.HandleFunc("/", sayhelloName) //设置访问的路由
	err := http.ListenAndServe(":9090", nil) //设置监听的端口
	if err != nil {
		log.Fatal("ListenAndServe: ", err)
	}
}

函数1:

func HandleFunc(pattern string, handler func(ResponseWriter, *Request))
//HandleFunc注册一个处理器函数handler和对应的模式pattern(注册到DefaultServeMux)。ServeMux的文档解释了模式的匹配机制。
var DefaultServeMux = NewServeMux()
//DefaultServeMux是用于Serve的默认ServeMux。
func NewServeMux() *ServeMux
//NewServeMux创建并返回一个新的*ServeMux

函数2:

func ListenAndServe(addr string, handler Handler) error
//ListenAndServe监听TCP地址addr,并且会使用handler参数调用Serve函数处理接收到的连接。
//handler参数一般会设为nil,此时会使用DefaultServeMux(默认的路由器)。

--------------------------------------第一个函数解析-------------------------------------------------------------

1、HTTP包默认的路由器:DefaultServeMux

type ServeMux struct {  //ServeMux就是路由器类型
	mu sync.RWMutex   //锁,由于请求涉及到并发处理,因此这里需要一个锁机制
	m  map[string]muxEntry  // 路由规则,一个string对应一个mux实体,这里的string就是注册的路由表达式
	hosts bool // 是否在任意的规则中带有host信息
}
//ServeMux类型是HTTP请求的多路转接器。
//它会将每一个接收的请求的URL与一个注册模式的列表进行匹配,并调用和URL最匹配的模式的处理器。
type muxEntry struct {
	explicit bool   // 是否精确匹配
	h        Handler // 这个路由表达式对应哪个handler
	pattern  string  //匹配字符串
}
type Handler interface {
	ServeHTTP(ResponseWriter, *Request)  // 路由器实现
}
//实现了Handler接口的对象可以注册到HTTP服务端,为特定的路径及其子树提供服务。
//ServeHTTP应该将回复的头域和数据写入ResponseWriter接口然后返回。返回标志着该请求已经结束,
//HTTP服务端可以转移向该连接上的下一个请求。


路由器:就是访问特定URI的时候,执行该URI指定的函数(controller)。

上面讲到HandleFunc函数的作用是把一个模式(URI)对应的处理函数(controller)注册到HTTP包默认的路由器-DefaultServeMux中。那么这个注册的过程是怎么进行的呢?


注册“模式-处理函数”对到HTTP默认路由器中:

注册“模式-处理函数”对到路由器中,代码中就是把模式字符串如"/",和函数名写入到ServeMux的实例中-DefaultServeMux。也就是写到map[string]muxEntry这个map里面。模式字符串对应string,而处理函数对应muxEntry结构体的Handler类型。从上面的几个struct和interface中可以看出,如果要把我们自己写的函数写入到muxEntry的h中,函数必须要实现Handler这个接口。然而,从最上面的HTTP服务器代码中看到sayHelloName这个函数并没有实现Handler这个结构啊,这是怎么实现的呢?


调用逻辑①

这里就涉及到上面讲到的Handl

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值