go使用net/http 创建web服务器-高阶篇

LogicCraftMasterPro
• 阅读 854

之前我写了一篇 go使用net/http 创建web服务器
这篇文档,简单的介绍了,如何创建 web服务器。这篇文章主要使用了DefaultServeMux。
但很多时候,比如我们的gin框架等,都自己实现了自定义Mux,今天我们也来学习下。

一、自定义ServeMux

我们回到上章的使用HandleFunc创建server,代码如下:

package main

import (
    "fmt"
    "net/http"
)

func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello World")
}

func main() {
    http.HandleFunc("/index", index)
    http.ListenAndServe(":8080", nil)
}

这里我们修改一下使用自定义mux,变成代码如下:

package main

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

func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello World")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/index", index)

    server := &http.Server{
        Addr:         ":8080",
        Handler:      mux,
        ReadTimeout:  20 * time.Second,
        WriteTimeout: 20 * time.Second,
    }
    server.ListenAndServe()
}

我们发现其实有两步。

  1. 自定义mux
  2. 自定义server

1.1 自定义mux

我们使用http.NewServeMux()来新建一个ServeMux,
然后再使用HandleFunc函数来注册路由。其实也是两步。

1.2 自定义server

我们使用http.Server{}来新建一个server。
然后使用server.ListenAndServe()方法来创建服务器以及监听端口。
在这里mux作为 server的一个参数传进来。

1.3 ListenAndServe优化

我们也可以把mux作为一个参数传到 ListenAndServe

package main

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

func index(w http.ResponseWriter, r *http.Request) {
    fmt.Fprintln(w, "Hello World")
}

func main() {
    mux := http.NewServeMux()
    mux.HandleFunc("/index", index)

    http.ListenAndServe(":8080",mux)
}
点赞
收藏
评论区
推荐文章
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
皕杰报表(关于日期时间时分秒显示不出来)
在使用皕杰报表设计器时,数据据里面是日期型,但当你web预览时候,发现有日期时间类型的数据时分秒显示不出来,只有年月日能显示出来,时分秒显示为0:00:00。1.可以使用tochar解决,数据集用selecttochar(flowdate,"yyyyMMddHH:mm:ss")fromtablename2.也可以把数据库日期类型date改成timestamp
雷厉风行 雷厉风行
2年前
Mac程序员软件-GoLand 2022 for Mac(最好用的GO语言编程软件)永久激活完美兼容版
JetBrainsGoLand是专门为Go编程语言设计的集成开发环境(IDE)。它提供了广泛的功能,例如代码完成、调试、测试工具以及与Git等版本控制系统的集成。GoLand还包括对Gin和Beego等流行Web框架的支持,使开发人员可以更轻松地使用Go构建Web应用程序。
Stella981 Stella981
4年前
Linux应急响应(三):挖矿病毒
0x00前言随着虚拟货币的疯狂炒作,利用挖矿脚本来实现流量变现,使得挖矿病毒成为不法分子利用最为频繁的攻击方式。新的挖矿攻击展现出了类似蠕虫的行为,并结合了高级攻击技术,以增加对目标服务器感染的成功率,通过利用永恒之蓝(EternalBlue)、web攻击多种漏洞(如Tomcat弱口令攻击、WeblogicWLS组件漏洞、Jboss
Stella981 Stella981
4年前
Kerberos无约束委派的攻击和防御
 0x00前言简介当ActiveDirectory首次与Windows2000Server一起发布时,Microsoft就提供了一种简单的机制来支持用户通过Kerberos对Web服务器进行身份验证并需要授权用户更新后端数据库服务器上的记录的方案。这通常被称为Kerberosdoublehopissue(双跃点问题),
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java 线程池原理分析
1.简介线程池可以简单看做是一组线程的集合,通过使用线程池,我们可以方便的复用线程,避免了频繁创建和销毁线程所带来的开销。在应用上,线程池可应用在后端相关服务中。比如Web服务器,数据库服务器等。以Web服务器为例,假如Web服务器会收到大量短时的HTTP请求,如果此时我们简单的为每个HTTP请求创建一个处理线程,那么服务器
Easter79 Easter79
4年前
TarsGo 服务获取自定义模版(配置)值
!(https://oscimg.oschina.net/oscnet/297f6e2f0dd24ad4862c8937a0b0b2bf.gif)之前的文章中我们介绍了如何使用TarsGo创建HTTP服务(https://www.oschina.net/action/GoToLink?urlhttp%3A%2F%2Fmp.weixin
LogicCraftMasterPro
LogicCraftMasterPro
Lv1
雨纷纷旧故里草木深我听闻你始终一个人
文章
3
粉丝
0
获赞
0