学习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 gee

import (
	"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 + "-" + pattern
	engine.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.Path
	if handler, ok := engine.router[key]; ok {
		handler(w, r)
	} else {
		fmt.Fprintf(w, "404 NOT FOUND", r.URL)
	}
}

http-base/gee/go.mod

module gee

go 1.21.5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/288698.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python入门学习篇(十七)——封装、继承、多态

1 封装 1.1 理解 属性和方法书写到类里面的操作即为封装 封装可以理解成私有化属性和私有化方法1.2 示例代码 class Person():p_num 0 # 用于统计数量def __init__(self, name, age, sex, job):# __name为私有化属性self.__name nameself.age ageself.sex sexself.job …

一种可扩展的多属性可控文本生成即插即用方法

《An extensible plug-and-play method for multi-aspect controllable text generation》论文解读 文章的主要工作 (1)提出了一种可扩展的即插即用方法,PROMPT GATING,用于多方面可控文本生成,它能够通过简单地连接…

引导和服务

一、Linux操作系统引导过程 1、引导过程总览图 2、引导过程的详细步骤 1.开机自检(BIOS) 服务器主机开机以后,将根据主板BIOS中的设置对CPU、内存、显卡、键盘等设备进行初步检测,检测成功后根据预设的启动顺序移交系统控制权&a…

【MySQL】数据库之主从复制和读写分离

目录 一、什么是读写分离? 二、为甚要读写分离? 三、什么时候需要读写分离? 四、主从复制与读写分离 五、MySQL支持的二进制日志格式 六、主从复制的工作原理 七、MySQL读写分离的原理 八、MySQL读写分离的方式有哪些 九、实验一&am…

Windows 7 虚拟机的安装以及解决安装VMVMware tools问题

1.Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 参考:Windows 7 虚拟机的安装以及解决安装VMVMware tools问题 注意:下载官方补丁:Microsoft Update Catalog在智慧联想浏览器中打不开,要在火狐中才能打开下载。 2.win7如…

Navicat(数据库可视化软件)安装教程以及连接MYSQL

Navicat安装教程以及连接MYSQL Navicat(数据库可视化软件)安装流程安装MySQLnavicat连接mysql数据库 Navicat(数据库可视化软件) Navicat 是一款专门为 MySQL 设计的可视化数据库 GUI 管理工具,我们可以在自己的计算机…

【HarmonyOS开发】共享包HAR和HSP的创建和使用以及三方库的发布

OpenHarmony提供了两种共享包,HAR(Harmony Archive)静态共享包,和HSP(Harmony Shared Package)动态共享包。 HAR与HSP都是为了实现代码和资源的共享,都可以包含代码、C库、资源和配置文件&…

Windows可以ping通ubuntu,但ubuntu无法ping通windows

使用了NAT网卡和桥接网卡,电脑连了WiFi,桥接网卡桥接到WLAN上,Windows可以ping通Ubuntu但反过来不行! 1.可能是防火墙的问题,按照如下设置,无果 考虑是不是使用了两个网卡冲突了,取消NAT的链接 …

【Mybatis】Mybatis如何防止sql注入

🍎个人博客:个人主页 🏆个人专栏: Mybatis ⛳️ 功不唐捐,玉汝于成 目录 前言 正文 1、使用参数化的 SQL 语句: 2、使用动态 SQL 标签: 3、禁止拼接 SQL: 4、限制参数类…

SkyWalking 快速入门

SkyWalking 是一个基于 Java 开发的分布式系统的应用程序性能监视工具,专为微服务、云原生架构和基于容器(Docker、K8s、Mesos)架构而设计。 一、SkyWalking 简介 SkyWalking 是观察性分析平台和应用性能管理系统。 提供分布式追踪、服务网格…

SpringBoot的基础配置

问题导入 入门案例中没有引入spring-webmvc等依赖包,没有配置Tomcat服务器,为什么能正常启动?我们没有配置端口号,为什么端口是8080? 起步依赖 starter SpringBoot中常见项目名称,定义了当前项目使用的所…

AUTOSAR软件架构描述文档,AUTOSAR_EXP_LayeredSoftwareArchitecture

AUTOSAR软件架构描述文档,我们常见的经典的CP架构及OS双核等架构描述 下载链接:https://www.autosar.org/fileadmin/standards/R21-11/CP/AUTOSAR_EXP_LayeredSoftwareArchitecture.pdf

71.乐理基础-打拍子-三连音的变体

上一个内容:70.乐理基础-打拍子-三连音-CSDN博客 首先常见的三连音如下图的样子: 三连音的变体遇到的次数并不会很多,可以不用看不用懂 三连音的变体: 1.三连音节奏型依然有可能藏有休止符,如下图 2.在这之前的三连音…

Java LinkedList解密

一、LinkedList最底层的原理 LinkedList其实底层是链表: 当初始化的时候,会将链表这个节点的值、prev指针和next指针初始化。 二、LinkedList初始化 无参构造并没有做什么。有参构造会先调用无参构造,然后调用addAll方法将链表的节点都初始化…

基于花授粉算法优化的Elman神经网络数据预测 - 附代码

基于花授粉算法优化的Elman神经网络数据预测 - 附代码 文章目录 基于花授粉算法优化的Elman神经网络数据预测 - 附代码1.Elman 神经网络结构2.Elman 神经用络学习过程3.电力负荷预测概述3.1 模型建立 4.基于花授粉优化的Elman网络5.测试结果6.参考文献7.Matlab代码 摘要&#x…

C++ 多态向上转型详解

文章目录 1 . 前言2 . 多态3 . 向上转型4 . 总结 【极客技术传送门】 : https://blog.csdn.net/Engineer_LU/article/details/135149485 1 . 前言 此篇博文详解C的多态向上转型平台 : Qt 2 . 多态 【Q】什么是多态? 【A】解释如下 : 通俗来说,就是多种形态,具体…

八皇后问题(C语言/C++)超详细讲解/由浅入深---深入八皇后问题

介绍引入 在计算机科学中,八皇后问题是一个经典的回溯算法问题。这个问题的目标是找出一种在8x8国际象棋棋盘上放置八个皇后的方法,使得没有任何两个皇后能够互相攻击。换句话说,每一行、每一列以及对角线上只能有一个皇后。 想象一下&…

C++多态性——(3)动态联编的实现——虚函数

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 成功的秘诀就在于多努力一次&#xff…

Sam Altman的一天被曝光!每天15小时禁食、服用小剂量安眠药,尽可能避免开会

Sam Altman在经历了几天混乱的管理重组后,重新回到了OpenAI的CEO位置。在日常生活中,奥特曼与许多科技行业高管一样,痴迷于延长自己的寿命。 据报道,他还为应对末日场景(致命合成病毒的释放、核战争和人工智能攻击等&…

【AIGC摄影构图prompt】与重不同的绘制效果,解构主义+优美连拍提示效果

提取关键词构图: 激进解构主义 在prompt中,激进解构主义的画面效果可能是一种颠覆传统和权威的视觉呈现。这种画面可能以一种极端或激烈的方式表达对现有社会结构和观念体系的批判和质疑。 具体来说,这种画面效果可能包括: 破…