3.06 路由树-静态匹配之集成Server
本节课工程结构如下:
PART1. 实现HTTPServer.serve()
方法
HTTPServer.serve()
方法之前的课程中说过,该方法的职责为:查找路由树并执行命中的业务逻辑.我们也已经实现了router.findRoute()
.
httpServer.go
:此处只写做了修改的方法,其他没有改动的方法就不贴了,看着太乱
实现
httpServer.serve()
方法:
删除
http. ServeHTTP()
方法中的panic()
PART2. 修改HandleFunc
类型的入参
HandleFunc
类型的入参2.1 修改入参类型为*Context
*Context
之前入参类型为Context
handleFunc.go
:
2.2 修改其他受影响的地方
此处只列出受影响的方法或文件(文件基本上都是测试文件),读者自行比对修改即可
HTTPServer.serve()
httpServer_test.go
router_test.go
PART3. 测试
TODO:文件开头的那句go:build e2e
的含义要去查
在httpServer_test.go
新创建一个测试函数:
httpServer_test.go
:
其实这里还有一个问题:如果将s := NewHTTPServer()
更改为s := &HTTPServer{}
,就会因为router
为空而触发panic.
PART4. 修改HTTPServer
的成员属性
HTTPServer
的成员属性将*router
修改为router
修改原因:就是为了和PPT上的统一一下.这里我看过,GIN的Engine
是组合了RouterGroup
;而Beego的HttpServer
则是组合了*ControllerRegister
.倒不是大家都用非指针类型
httpServer.go
:
router.go
:
router_test.go
中也有修改
至此,静态路由匹配功能完成.将此版本作为v2.
附录
需要课后尝试的内容
将HttpServer
结构体修改为私有
这个修改的目的在于:强迫使用者必须使用NewHttpServer()
函数来创建HttpServer
结构体的实例.否则他自己直接s := &HTTPServer{}
触发panic.
何时将成员属性类型定义为指针类型?何时将成员属性类型定义为结构体类型?
以HTTPServer为例:
case1. 使用者用&HTTPServer
的情况
&HTTPServer
的情况我们期望使用者用HTTPServer
的指针,因此其成员属性router
是不是指针就不重要了,都行
这里我试过:
则打印:s.router is nil
但如果改为:
则打印:0xc00011a050
.可以看到已经给router
分配了内存
case2. 使用者用HTTPServer
的情况
HTTPServer
的情况则打印:s.router is nil
则打印:0xc0000aa050
.同样已经给router
分配了内存.但是!这种方式要考虑值传递的问题.不要忘记GO语言中所有的传递都是值传递!
结论:拿不准就用指针!
Last updated