Go提供了一套完整的Web服务器标准库,使得go构建服务器非常简单,创建服务器只需要调用ListenAndServe即可。相应的Web函数库在net/http包中,本文参考《Go Web编程》中的内容,介绍服务器的构造,有兴趣的小伙伴可以亲自去翻阅这本书。
首先构建两种最简单的服务器:
1 2 3 4 5 6 7 8 9 | package main import ( "net/http" ) func main() { http.ListenAndServe( "" , nil) } |
这里直接是用了http包的ListenAndServe函数,用户可以自定义Server对象对服务器进行更多的设置,例如设置超时时间、记录日志等操作。
1 2 3 4 5 6 7 8 9 10 11 12 13 | package main import ( "net/http" ) func main() { server := http.Server{ Addr: "127.0.0.1" , Handler: nil, } server.ListenAndServe() } |
http.Server结构的公开配置如下:
1 2 3 4 5 6 7 8 9 10 | type Server struct { Addr string Handler Handler ReadTimeOut time.Duration WriteTimeOut time.Duration MaxHeaderBytes int TLSConfig *tls.Config ConnState func (net.Conn,ConnState) ErrorLog *log.Logger } |
提供HTTPS服务,只需要将监听函数换为server.ListenAndServeTLS("cert.pem", "key.pem")
处理器和处理函数
上面生成的服务器没有写处理程序,无法处理请求,此时需要添加处理器或处理函数。
例如添加处理器:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | package main import ( "fmt" "net/http" ) type MyHandler struct {} func (h *MyHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello World" ) } func main() { handler := MyHandler{} server := http.Server{ Addr: "127.0.0.1:8080" , Handler: &handler, } server.ListenAndServe() } |
如果要使用多个处理器来处理不同的请求:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | package main import ( "fmt" "net/http" ) type HelloHandler struct {} func (h *HelloHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello" ) } type WorldHandler struct {} func (h *WorldHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "World!" ) } func main() { hello := HelloHandler{} world := WorldHandler{} server := http.Server{ Addr: "127.0.0.1:8080" , } http.Handle( "/hello" , &hello) http.Handle( "/world" , &world) server.ListenAndServe() } |
在上面的定义中,处理器都有一个函数ServeHTTP。在go语言中,一个处理器就是一个拥有ServeHTTP方法的接口。DefaultServeMux多路复用器是ServeMux结构的一个实例,后者也拥有ServeHTTP方法,所以要定义自己的处理器,只需要实现ServeHTTP就行。
上述方式每添加一个请求,就要创建一个handler,会很麻烦。可以使用处理器函数,只需要定义处理函数,而无需创建handler。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | package main import ( "fmt" "net/http" ) func hello(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hello" ) } func world(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "World!" ) } func main() { server := http.Server{ Addr: "127.0.0.1:8080" , } http.HandleFunc( "/hello" , hello) http.HandleFunc( "/world" , world) server.ListenAndServe() } |
函数原型为:
1 2 3 4 5 6 | func Handle(pattern string, handler Handler) { DefaultServeMux.Handle(pattern, handler) } func HandleFunc(pattern string, handler func (ResponseWriter, *Request)) { DefaultServeMux.HandleFunc(pattern, handler) } |
【推荐】博客园的心动:当一群程序员决定开源共建一个真诚相亲平台
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】Flutter适配HarmonyOS 5知识地图,实战解析+高频避坑指南
【推荐】开源 Linux 服务器运维管理面板 1Panel V2 版本正式发布
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 大数据高并发核心场景实战,数据持久化之冷热分离
· 运维排查 | SaltStack 远程命令执行中文乱码问题
· Java线程池详解:高效并发编程的核心利器
· 从“看懂世界”到“改造世界”:AI发展的四个阶段你了解了吗?
· 协程本质是函数加状态机——零基础深入浅出 C++20 协程
· 基于.net6的一款开源的低代码、权限、工作流、动态接口平台
· 一个自认为理想主义者的程序员,写了5年公众号、博客的初衷
· Claude Code 初体验 - Windows
· LinqPad:C#代码测试学习一品神器
· .NET 8 gRPC 实现高效100G大文件断点续传工具