package main

//gohttp底层实现,通过gohttp不是通过beego实现的输出
// import (
"io"
"log"
"net/http"
) func main() {
//设置路由
http.HandleFunc("/", sayHello)
err := http.ListenAndServe(":8080", nil)
if err != nil {
log.Fatal(err)
}
} func sayHello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello vwesion1")
}
package main

//gohttp第二个版本:通过mux,handler实现路由

import (
"io"
"log"
"net/http"
) func main() {
mux := http.NewServeMux() //ServeMux//实现handler注册到ServeMux然后在进行路由的注册
mux.Handle("/", &myHandler{}) //注册路由和handler
mux.Handle("/hello", sayHello) //通过函数注册路由 err := http.ListenAndServe(":8080", mux)
if err != nil {
log.Fatal(err)
}
} type myHandler struct { //这个handle要实现ServerHTTP方法 } func (this *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello vwesion2,"+r.URL.String())
} func sayHello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello vwesion2,"+r.URL.String())
}
package main

//模拟gohttp底层,第三个版本

import (
"fmt"
"io"
"log"
"net/http"
"os" //获取静态文件
"time"
) func main() {
server := http.Server{
Addr: ":8080",
Handler: &myHandler{}, //自定义handler
ReadTimeout: * time.Second,
} myMux = make(map[string]func(http.ResponseWriter, *http.Request)) //初始化map
myMux["/"] = sayHello //访问根目录调用sayHellp方法
myMux["/bye"] = sayBye //访问/bye调用sayBye方法 err := server.ListenAndServe()
if err != nil {
log.Fatal(err)
}
} type myHandler struct{} func (this *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { //handler来解析url,调用不同的方法,
if h, ok := myMux[r.URL.String()]; ok { //if ok 对map的断言,ok是判断存不存在,h是获取的map的value,
fmt.Println(h, ok)
h(w, r)
return
}
io.WriteString(w, "uuuu,"+r.URL.String())
} var myMux map[string]func(http.ResponseWriter, *http.Request) //自定义mux,根据不同的string调用不同的方法 func sayHello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello "+r.URL.String())
} func sayBye(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "sayBye "+r.URL.String())
}
package main

//获取静态文件

import (
"io"
"log"
"net/http"
"os" //获取路径,静态文件服务器要获取绝对路径,根据当前路径定位到绝对路径,
) func main() {
mux := http.NewServeMux() //ServeMux//实现handler注册到ServeMux然后在进行路由的注册
mux.Handle("/", &myHandler{}) //注册路由和handler
mux.Handle("/hello", sayHello) //通过函数注册路由 wd, err := os.Getwd() //wd是当前路径
if err != nil {
log.Fatal(err)
} mux.Handle("/static/",
http.StripPrefix("/static/", http.FileServer(http.Dir(wd)))) //StripPrefix去除static前缀 err = http.ListenAndServe(":8080", mux)
if err != nil {
log.Fatal(err)
}
} type myHandler struct { //这个handle要实现ServerHTTP方法 } func (this *myHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello vwesion2,"+r.URL.String())
} func sayHello(w http.ResponseWriter, r *http.Request) {
io.WriteString(w, "hello vwesion2,"+r.URL.String())
}

beego3---gohttp底层实现的更多相关文章

  1. 深入浅出Redis-redis底层数据结构(上)

    1.概述 相信使用过Redis 的各位同学都很清楚,Redis 是一个基于键值对(key-value)的分布式存储系统,与Memcached类似,却优于Memcached的一个高性能的key-valu ...

  2. Objective-C中block的底层原理

    先出2个考题: 1. 上面打印的是几,captureNum2 出去作用域后是否被销毁?为什么? 同样类型的题目: 问:打印的数字为多少? 有人会回答:mutArray是captureObject方法的 ...

  3. nodejs操作arduino入门(javascript操作底层硬件)

    用Javascript来操作硬件早就不是一件稀奇的事情了. 所以作为一名电子专业出身的FE,我也打算尝试一下用js来驱动arduino: 要想操作这些底层硬件,肯定是需要一些工具的,我这里介绍的工具主 ...

  4. 支撑Java NIO 与 NodeJS的底层技术

    支撑Java NIO 与 NodeJS的底层技术 众所周知在近几个版本的Java中增加了一些对Java NIO.NIO2的支持,与此同时NodeJS技术栈中最为人称道的优势之一就是其高性能IO,那么我 ...

  5. 介绍,介绍我的底层支持库 Net.Sz.CFramework

    Net.Sz.CFramework  是我自己的底层库,是经过验证的底层库. 包含: socket tcp协议,socket http协议线程池,线程模型,任务模型,定时器模型,日志模块脚本模块一些辅 ...

  6. iOS - 分析JSON、XML的区别和解析方式的底层是如何实现的(延伸实现原理)

    <分析JSON.XML的区别,JSON.XML解析方式的底层是如何实现的(延伸实现原理)> (一)JSON与XML的区别: (1)可读性方面:基本相同,XML的可读性比较好: (2)可扩展 ...

  7. C#剪切,复制,粘贴底层应用编写

    zz备用复制剪切粘贴的底层应用 /// <summary> /// 复制或剪切文件至剪贴板(方法) /// </summary> /// <param name=&quo ...

  8. 从PHP底层源码去深入理解数组,并用C模拟PHP关联数组(原创)

    PHP是一门入门容易,使用范围广泛的语言,以其灵活性以及web后端开发被很多人熟知,也被很多人戏称“PHP是世界上最好的语言”.本人是一名“忠实”的PHPer,相信用过PHP的程序员都会体会到PHP数 ...

  9. Azure底层架构的初步分析

    之所以要写这样的一篇博文的目的是对于大多数搞IT的人来说,一般都会对这个topic很感兴趣,因为底层架构直接关乎到一个公有云平台的performance,其实最主要的原因是我们的客户对此也非常感兴趣, ...

随机推荐

  1. NOIP专题复习2 图论-生成树

    目录 一.知识概述 二.典型例题 1.口袋的天空 三.算法分析 (一)Prim算法 (二)Kruskal 四.算法应用 1.[NOIP2013]货车运输 五.算法拓展 1977: [BeiJing20 ...

  2. mysql负载均衡

    一.docker安装haproxy:docker pull haproxy 二.配置haproxy(参考url:https://zhangge.net/5125.html),vim /usr/loca ...

  3. Python之数字

    Python之数字 int(数字)===>在Python3中,int没有范围,在Python2中,int超出范围就叫长整型(Long). 浮点运算:单精度 float 双精度 double a: ...

  4. list & dictionary

    list不能直接进行对应,dictionary可以 list用[],dictionary用{}

  5. 2017 计蒜之道 初赛 第一场 B阿里天池的新任务(简单)

    题链:"https://nanti.jisuanke.com/t/15500" 本来希望通过找循环节然后套KMP来通过后面题的,可是只过了B题,可能循环节不一定是存在的. #inc ...

  6. SQL Server 2008如何创建定期自动备份任务

    我们知道,利用SQL Server 2008数据库可以实现数据库的定期自动备份.方法是用SQL SERVER 2008自带的维护计划创建一个计划对数据库进行备份,下面我们将SQL SERVER 200 ...

  7. [BZOJ2462] [BeiJing2011]矩阵模板(二维Hash)

    传送门 二维哈希即可. 注意质数选的大一些,不然会超时. 还有插入的时候不判重居然比判重要快.. ——代码 #include <cstdio> int main() { ; ") ...

  8. zoj 2676 dinic模板求实型最小割(可做dinic模板)

    #include<stdio.h> #include<string.h> #include<stdlib.h> #include<queue> #inc ...

  9. Ftp启动与关闭

    //启动 service vsftpd start //关闭 service vsftpd stop 查看进程 ps -ef | grep ftp root : ? :: /usr/sbin/vsft ...

  10. 关于FFM (Field-aware Factorization Machines) 的几篇博客

    深入FFM原理与实践 http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html#mjx-eqn-e ...