- 使用 Trie 树实现动态路由(dynamic route)解析。
- 支持两种模式
:name和*filepath,代码约150行。
- 将
路由(router)独立出来,方便之后增强。 - 设计
上下文(Context),封装 Request 和 Response ,提供对 JSON、HTML 等返回类型的支持。 - 动手写 Gee 框架的第二天,框架代码140行,新增代码约90行
- 简单介绍
net/http库以及http.Handler接口。 - 搭建
Gee框架的雏形,代码约50行。
大部分时候,我们需要实现一个 Web 应用,第一反应是应该使用哪个框架。不同的框架设计理念和提供的功能有很大的差别。比如 Python 语言的 django和flask,前者大而全,后者小而美。Go语言/golang 也是如此,新框架层出不穷,比如Beego,Gin,Iris等。那为什么不直接使用标准库,而必须使用框架呢?在设计一个框架之前,我们需要回答框架核心为我们解决了什么问题。只有理解了这一点,才能想明白我们需要在框架中实现什么功能。
核心原理:Go 的方法接收器「值 / 指针」自动转换
Go 语言对方法调用做了语法糖优化:调用方法时,无论接收器(Receiver)定义为值类型还是指针类型,Go 会自动完成「值→指针」或「指针→值」的转换(只要符合可寻址规则)。
mux 是 multiplexer(多路复用器)的缩写。
在 Go 的 ServeMux 中,其核心作用是将多个 HTTP 请求路径(及其对应的处理器)“多路复用”—— 接收客户端的 HTTP 请求后,根据请求的 URL 路径匹配到对应的处理器函数,实现一个服务器对多个请求路由的统一管理,就像 “交通枢纽” 一样分发请求。
Go 语言的 net/http 包是构建 HTTP 客户端和服务端的核心标准库,设计简洁且高性能,原生支持 HTTP/1.1、HTTP/2(需手动启用)、HTTPS,以及路由注册、中间件、Cookie 处理等核心能力。
在 Go 语言中,make() 和 new() 都是用于内存分配的内置函数,但它们的设计目标、适用类型、返回值和内存初始化行为有本质区别。下面从核心维度对比,并结合示例说明各自的使用场景。
当你在 struct 中定义字段时,到底该用 Entry(值)、*Entry(指针)、[]Entry(值切片)还是 []*Entry(指针切片)?
“在 Go 中,我应该使用 (s T) 还是 (s *T)?”
这恐怕是 Go 开发者(无论新手还是老手)最常问的问题之一。一个错误的选择可能导致代码功能出错、性能低下,或者引入难以察觉的并发 Bug。