go http server读书笔记

本文是关于Go语言中http服务器的读书笔记,通过三种方式展示了Go HTTP服务器的简洁和强大:1. 写简单的HTTP服务器;2. 实现带路由的HTTP服务器;3. 分析源码并实现自定义Handler。通过分析源码,理解了DefaultServeMux的工作原理,包括路由匹配、HandlerFunc适配和ServeHTTP的调用流程。
摘要由CSDN通过智能技术生成

go http server读书笔记

package main

import (
    "fmt"
    "net/http"
    "time"
)

type customHandler struct {
}

func (cb *customHandler) chenxun(w http.ResponseWriter, r *http.Request) {
    fmt.Println("customHandler!!")
    w.Write([]byte("customHandler!!"))
}

func main() {
    var server *http.Server = &http.Server{
        Addr:           ":8080",
        Handler:        &customHandler{},
        ReadTimeout:    10 * time.Second,
        WriteTimeout:   10 * time.Second,
        MaxHeaderBytes: 1 << 20,
    }
    server.ListenAndServe()
    select {}
}


HTTP服务器

接下来就是重点了,我们的HTTP服务器,这个大家都不陌生,HTTP是最常用的方式之一,通用性很强,跨团队协作上也比较受到推荐,排查问题也相对来说简单。

我们接下来以3种方式来展现Golang的HTTP服务器的简洁和强大。

  1. 写一个简单的HTTP服务器
  2. 写一个稍微复杂带路由的HTTP服务器
  3. 分析源码,然后实现一个自定义Handler的服务器

然后我们对照net/http包来进行源码分析,加强对http包的理解。

1、写一个简单的HTTP服务器:

package main;
    
    import (
        "net/http"
    )
    
    funchello(w http.ResponseWriter, req *http.Request) {
   
        w.Write([]byte("Hello"))
    }
    funcsay(w http.ResponseWriter, req *http.Request) {
   
        w.Write([]byte("Hello"))
    }
    funcmain() {
   
        http.HandleFunc("/hello", hello);
        http.Handle("/handle",http.HandlerFunc(say));
        http.ListenAndServe(":8001", nil);
        select{
   };//阻塞进程
    }

是不是很简单,我用2种方式演示了这个例子,HandleFunc和Handle方式不同,却都能实现一个路由的监听,其实很简单,但是很多人看到这都会有疑惑,别着急,咱们源码分析的时候你会看到。

2、写一个稍微复杂带路由的HTTP服务器:

对着上面的例子想一个问题,我们在开发中会遇到很多问题,比如handle/res,handle/rsa…等等路由,这两个路由接受的参数都不一样,我们应该怎么写。我先来个图展示下运行结果。

是不是挺惊讶的,404了,路由没有匹配到。可是我们写handle这个路由了。

问题:

  1. 什么原因导致的路由失效
  2. 如何解决这种问题,做一个可以用Controller来控制的路由

问题1:

我们在源码阅读分析的时候会解决。

问题2:

我们可以设定一个控制器Handle,它有2个action,我们的执行handle/res对应的结果是调用Handle的控制器下的res方法。这样是不是很酷。

来我们先上代码:

静态目录:

  1. css
  2. js
  3. image

静态目录很好实现,只要一个函数http.FileServer(),这个函数从文字上看就是文件服务器,他需要传递一个目录,我们常以http.Dir("Path")来传递。

其他目录大家自己实现下,我们来实现问题2,一个简单的路由。

我们来看下代码

package main;
    
    import (
       "net/http"
       "strings"
       "reflect"
       "fmt"
    )
    
    funchello(w http.ResponseWriter, req *http.Request) {
   
        w.Write([]byte("Hello"));
    }
    
    
    type Handlers struct{
   
    
    }
    
    func(h *Handlers) ResAction(w http.ResponseWriter, req *http.Request)  {
   
        fmt.Println("res");
        w.Write([]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值