本篇是完全参考gin的功能,自己手动实现一个类似的功能,帮助自己理解和学习gin框架

目的

  • 简单介绍net/http库以及http.Handler接口
  • 实现简单的功能

标准库启动Web服务

  1. import "net/http"
  2. func helloHandler(w http.ResponseWriter, r *http.Request) {
  3. w.Write([]byte("hello world"))
  4. }
  5. func main() {
  6. http.HandleFunc("/hello", helloHandler)
  7. http.ListenAndServe(":8088", nil)
  8. }
设置了一个 /hello 路由,请求返回 hello world。
  1. ~ curl 127.0.0.1:8088/hello
  2. hello world
http.ListenAndServe源码查看
  1. // ListenAndServe监听TCP网络地址addr,然后调用
  2. //使用处理程序处理传入连接的请求。
  3. //被接受的连接被配置为使能TCP keepalive。
  4. //
  5. //处理程序通常为nil,在这种情况下使用DefaultServeMux。
  6. //
  7. // ListenAndServe总是返回一个非nil错误。
  8. func ListenAndServe(addr string, handler Handler) error {
  9. server := &Server{Addr: addr, Handler: handler}
  10. return server.ListenAndServe()
  11. }

实现http.Handler接口

  • http.HandleFunc的第二个参数是什么意思,点进官方包看是什么
  1. package http
  2. type Handler interface {
  3. ServeHTTP(w ResponseWriter, r *Request)
  4. }

第二个参数是要实现 Handler 接口的方法,根据路由匹配交给实现对应的方法处理。

基于此对方法改造封装mygin.go
  1. package mygin
  2. import (
  3. "net/http"
  4. )
  5. type Engine struct {
  6. }
  7. func (e *Engine) ServeHTTP(w http.ResponseWriter, r *http.Request) {
  8. switch r.URL.Path {
  9. case "/":
  10. w.Write([]byte("success \n"))
  11. case "/hello":
  12. w.Write([]byte("hello world! \n"))
  13. default:
  14. w.Write([]byte("404 NOT FOUND" + r.URL.Path + " \n"))
  15. }
  16. }
  17. func Default() *Engine {
  18. return &Engine{}
  19. }
  20. func (e *Engine) Run(addr string) {
  21. err := http.ListenAndServe(addr, e)
  22. if err != nil {
  23. return
  24. }
  25. }
调用main.go
  1. package main
  2. import "gophp/mygin"
  3. func main() {
  4. engine := mygin.Default()
  5. engine.Run(":8088")
  6. }
curl请求
  1. ~ curl 127.0.0.1:8088/hello
  2. hello world
  3. ~ curl 127.0.0.1:8088
  4. success

Mygin 实现简单Http的更多相关文章

  1. 【造轮子】打造一个简单的万能Excel读写工具

    大家工作或者平时是不是经常遇到要读写一些简单格式的Excel? shit!~很蛋疼,因为之前吹牛,就搞了个这东西,还算是挺实用,和大家分享下. 厌烦了每次搞简单类型的Excel读写?不怕~来,喜欢流式 ...

  2. Fabio 安装和简单使用

    Fabio(Go 语言):https://github.com/eBay/fabio Fabio 是一个快速.现代.zero-conf 负载均衡 HTTP(S) 路由器,用于部署 Consul 管理的 ...

  3. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  4. 哪种缓存效果高?开源一个简单的缓存组件j2cache

    背景 现在的web系统已经越来越多的应用缓存技术,而且缓存技术确实是能实足的增强系统性能的.我在项目中也开始接触一些缓存的需求. 开始简单的就用jvm(java托管内存)来做缓存,这样对于单个应用服务 ...

  5. 在Openfire上弄一个简单的推送系统

    推送系统 说是推送系统有点大,其实就是一个消息广播功能吧.作用其实也就是由服务端接收到消息然后推送到订阅的客户端. 思路 对于推送最关键的是服务端向客户端发送数据,客户端向服务端订阅自己想要的消息.这 ...

  6. 我的MYSQL学习心得(一) 简单语法

    我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据类型 我的MYSQL学习心得(五) 运 ...

  7. 使用 Nodejs 搭建简单的Web服务器

    使用Nodejs搭建Web服务器是学习Node.js比较全面的入门教程,因为要完成一个简单的Web服务器,你需要学习Nodejs中几个比较重要的模块,比如:http协议模块.文件系统.url解析模块. ...

  8. ASP.NET Aries 入门开发教程2:配置出一个简单的列表页面

    前言: 朋友们都期待我稳定地工作,但创业公司若要躺下,也非意念可控. 若人生注定了风雨飘摇,那就雨中前行了. 最机开始看聊新的工作机会,欢迎推荐,创业公司也可! 同时,趁着自由时间,抓紧把这系列教程给 ...

  9. 简单入门canvas - 通过刮奖效果来学习

    一 .前言 一直在做PC端的前端开发,从互联网到行业软件.最近发现移动端已经成为前端必备技能了,真是不能停止学习.HTML5新增的一些东西,canvas是用的比较多也比较复杂的一个,简单的入门了一下, ...

  10. 简单粗暴地理解js原型链--js面向对象编程

    原型链理解起来有点绕了,网上资料也是很多,每次晚上睡不着的时候总喜欢在网上找点原型链和闭包的文章看,效果极好. 不要纠结于那一堆术语了,那除了让你脑筋拧成麻花,真的不能帮你什么.简单粗暴点看原型链吧, ...

随机推荐

  1. Python——第四章:内置函数(下)

    内置函数的使用方法: locals:函数会以字典的类型返回当前位置的所有局部变量 globals:函数会以字典的类型返回全部局部变量 zip: 可以把多个可迭代内容进行合并 sorted: 排序 fi ...

  2. 构建健康游戏环境:DFA算法在敏感词过滤的应用

    现在的游戏有敏感词检测这一点,相信大家也不陌生了,不管是聊天,起名,签名还是简介,只要是能让玩家手动输入的地方,一定少不了敏感词识别,至于识别之后是拒绝修改还是星号替换,这个就各有各的做法了,但是绕不 ...

  3. wasm+pygbag让你在网页上也能运行Python代码:【贪吃蛇游戏】

    引言 最近小伙伴告诉我一种新的方法,可以使用wasm来使浏览器网页能够运行Python代码.这一下子激起了我的兴趣,因为这意味着用户无需安装Python环境就能直接运行我的demo,这真是太方便了.所 ...

  4. 基于OpenCV的语音数据读取

      1)进入http://yuyin.baidu.com/app,在弹出的界面中单击要针对哪个应用开通语音识别服务,个人测试可全选 (开通个人认证,白嫖)     注意: 1.百度语音识别API对于要 ...

  5. C++中自定义结构体或类作为关联容器的键

    目录 1. 概述 2. 实例 1. 概述 STL中像set和map这样的容器是通过红黑树来实现的,插入到容器中的对象是顺序存放的,采用这样的方式是非常便于查找的,查找效率能够达到O(log n).所以 ...

  6. Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案

    本文分享自华为云社区<Navicat 携手华为云GaussDB,联合打造便捷高效的数据库开发和建模工具方案>,作者: GaussDB 数据库 . 近日, Navicat Premium顺利 ...

  7. 云小课 | 玩转HiLens Studio之手机实时视频流调试代码

    摘要:在开发技能过程中,搭配视频流调试技能是非常必要的环节,也是检验技能效果的重要环节.HiLens Studio推出使用手机实时视频流调试代码的功能,以手机摄像头实时的视频流作为技能输入,查看技能输 ...

  8. 用IoT放羊养牛,不出门也能知道它们的动向

    摘要:羊圈里几只小羊羔有点无精打采,"叮",牧民拉索划开手机,第一时间得知了这个情况.草场上有只牛一直到天黑都没回来,拉索再次通过手机软件,很快定位到那只独自流落在外的牛儿-- 本 ...

  9. Solon2 开发之IoC,九、自定义注解开发汇总

    1.定义构建能力注解,比如@Controller 注解类: @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Docum ...

  10. django实现微信公众号扫码登录

    首先是去获取access_token,access_token接口有次数限制,所以保存到缓存,失效时再去调用接口 import base64 import json import time impor ...