当前位置: 首页 > news >正文

学习Go语言Web框架Gee总结--http.Handler(一)

学习Go语言Web框架Gee总结--http.Handler

  • http-base/go.mod
  • http-base/main.go
  • http-base/gee/gee.go
  • http-base/gee/go.mod

网站学习来源:Gee

代码目录结构:
在这里插入图片描述

http-base/go.mod

//指定当前模块的名称为 "example"
module example//指定当前模块所需的 Go 版本为 1.21.5
go 1.21.5//表示当前模块需要一个名为 "gee" 的模块,版本为 v0.0.0
require gee v0.0.0//一个替换指令,它告诉编译器在构建过程中使用本地文件系统中的 gee 模块,而不是从远程仓库获取
replace gee => ./gee

go.mod 提供了module、require、replace、exclude四个命令

  • module语句指定包的名字(路径)

  • require语句指定的依赖项模块

  • replace语句可以替换依赖项模块

  • exclude语句可以忽略依赖项模块

http-base/main.go

package main//"fmt" 包用于格式化输入输出
//"gee" 是自定义的 Web 框架
//"net/http" 是 Go 标准库中用于 HTTP 编程的包
import ("fmt""gee""net/http"
)func main() {//创建一个 gee 实例r := gee.New()//使用 r.GET 注册了两个路由,分别处理根路径 "/" 和 "/hello" 的 GET 请求//每个路由都有一个处理函数,用于处理对应的请求//r.GET("/", func(w http.ResponseWriter, r *http.Request) {fmt.Fprintf(w, "URL.Path = %q\n", r.URL.Path)})r.GET("/hello", func(w http.ResponseWriter, r *http.Request) {for k, v := range r.Header {fmt.Fprintf(w, "Header[%q] = %q\n", k, v)}})//启动 HTTP 服务器,监听在 9999 端口上r.Run(":9999")
}

效果如下:

在这里插入图片描述

在这里插入图片描述

其中fmt.Fprintf 函数是 fmt 包中的一个格式化输出函数,它的作用是将格式化的内容写入到指定的输出流(io.Writer 接口类型)中

函数签名为:

//其中type any = interface{}
func Fprintf(w io.Writer, format string, a ...any) (n int, err error)

所以上面的代码将会把 "URL.Path = " 和 r.URL.Path 的值按照指定的格式写入到 w 所指定的输出流中,这里的 w 是一个 http.ResponseWriter,用于将内容写入 HTTP 响应

http-base/gee/gee.go

//定义名为 gee 的包
package geeimport ("fmt""net/http"
)//定义类型 HandlerFunc,它是一个函数类型,接受一个 http.ResponseWriter和一个 *http.Request 作为参数,用于定义路由映射的处理方法
type HandlerFunc func(w http.ResponseWriter, r *http.Request)//定义结构体 Engine,有一个名为 router 的字段,类型为 map[string]HandlerFunc,用于存储路由信息
type Engine struct {router map[string]HandlerFunc
}//用于创建一个新的 Engine 实例,它返回一个指向 Engine 实例的指针,并初始化了 router 字段为一个空的 map
func New() *Engine {return &Engine{router: make(map[string]HandlerFunc),}
}//接受三个参数:HTTP 方法名、URL 模式和处理函数
//Engine中路由映射表router,key 由请求方法和静态路由地址构成,例如GET-/、GET-/hello、POST-/hello
//映射到不同的处理方法(Handler)
func (engine *Engine) addRoute(method string, pattern string, handler HandlerFunc) {key := method + "-" + patternengine.router[key] = handler
}func (engine *Engine) GET(pattern string, handler HandlerFunc) {engine.addRoute("GET", pattern, handler)
}func (engine *Engine) POST(pattern string, handler HandlerFunc) {engine.addRoute("POST", pattern, handler)
}//是对 ListenAndServe 的包装
func (engine *Engine) Run(addr string) (err error) {return http.ListenAndServe(addr, engine)
}//ServeHTTP 方法实现了 http.Handler 接口,用于统一处理 HTTP 请求
//解析请求的路径,查找路由映射表,如果查到,就执行注册的处理方法。如果查不到,就返回 404 NOT FOUND 
func (engine *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {key := r.Method + "-" + r.URL.Pathif handler, ok := engine.router[key]; ok {handler(w, r)} else {fmt.Fprintf(w, "404 NOT FOUND", r.URL)}
}

http-base/gee/go.mod

module geego 1.21.5
http://www.lryc.cn/news/272456.html

相关文章:

  • react+redux+antd-mobile 之 记账本案例
  • Day22
  • Windows下linux 子系统 WSL2怎样使用usb串口(USBIPD-win4.0.0)
  • 飞腾Ubantu22.04.3安装OpenNebula测试
  • gookit/color - Go语言命令行色彩使用库教程
  • python弹奏《起风了》
  • Linux---all
  • 前端中级算法题
  • Ant Design Vue 编译后的网页特点是什么,怎么确认他是用的前端 Ant Design Vue 技术栈的呢?
  • python | PYTHON正则表达式
  • 为什么大学c语言课不顺便教一下Linux,Makefile
  • Go后端开发 -- main函数 变量 常量 函数
  • 2023/12/30 c++ work
  • ctfshow——文件上传
  • 【RocketMQ每日一问】RocketMQ SQL92过滤用法以及原理?
  • Go语言中的包管理工具之Go Path的使用
  • cocos creator(2.4.7版本) webview 可以在上层添加UI控件
  • 2023 年四川省职业院校技能大赛“信息安全管理与评估”样题
  • ubuntu2204,mysql8.x安装
  • CG Magic分享云渲染和本地渲染之间的区别有什么?
  • 【算法与数据结构】763、LeetCode划分字母区间
  • 新火种AI|人形机器人敲响上市罗,首日市值高达390亿港元
  • SpringMVC框架
  • FreeRTOS——计数型信号量知识总结及实战
  • Linux下Docker Engine安装后的一些配置步骤
  • 【并发设计模式】聊聊Balking是如何实现以及具体原理
  • dubbo的一些问题思考
  • 盛最多水的容器(力扣11题)
  • .babky勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • 20240103-通过布局让自己的生活有有意义人生有价值