是否需要使用第三方框架来学习Golang?

发表时间: 2023-01-11 21:41

只要是入门过 Golang 的同学应该都知道 Golang 原生的 net/http 包功能很强大,通过 http.HandleFunc() 和 http.ListenAndServe()两个函数就可以创建一个简单的 web 服务,示例代码如下:

package main import (     "fmt"     "net/http" )  func sayHello(w http.ResponseWriter, r *http.Request) {     fmt.Fprintf(w, "Hello!") }  func main() {     http.HandleFunc("/hello", sayHello)     http.ListenAndServe(":80", nil) }

在网页中输入 http://localhost:80/hello,就可以得到 Hello!的字符串。

理解 HTTP 服务只需要关注两个端-客户端(client)和服务端(server),弄清楚如何接收处理来自 client 的 request,并向 client 返回 response。

接收request的过程中,最重要的是处理路由,即实现一个多路复用器(Multiplexer,作用是根据请求的 URL 找到对应的处理函数(handler)来处理 request 和构建 response )。DefaultServeMux 是 net/http 包提供的 Multiplexer,是 ServeMux 的一个实例。我们也可以根据自己的需求通过实现 ServeMux 来实现一个 Multiplexer。DefaultServeMux 源码如下:

var DefaultServeMux = &defaultServeMuxvar defaultServeMux ServeMux

HandleFunc()函数用于为指定的URL注册一个处理器。HandleFunc()处理器函数会在内部调用DefaultServeMux对象对应的方法,其内部实现源码如下:

 // HandleFunc registers the handler function for the given pattern // in the DefaultServeMux. // The documentation for ServeMux explains how patterns are matched. func HandleFunc(pattern string, handler func(ResponseWriter, *Request)) {     DefaultServeMux.HandleFunc(pattern, handler) }

由此看出,我们也可以使用默认多路复用器注册多个处理器,达到与处理器一样的作用。

那么问题来了,既然 net/http 包功能很强大了,那还需要第三方框架吗?

如果是很简单的一个项目,只需要提供几个接口并且业务逻辑也很简单,net/http 包就能满足需求。但平常开发中,大部分场景下,net/http 包的功能满足不了业务场景的需求,例如三方框架提供的如下功能:

  • 路径参数——net/http 支持路径完全匹配和前缀匹配,但不支持路径参数匹配,三方框架一般基于 redix tree 实现路由功能,占用内存更小,查找速度更快。
  • 强大的中间件功能——传入的 HTTP 请求可以由一系列中间件和最终操作来处理。在中间件中实现前置,后置处理逻辑。为框架提供了极大的灵活性和扩展性。
  • 路由组——可以将路由分为不同的组,方便开发维护,可以给每个组配置不同的路径前缀。中间件,更好地组织路由。
  • 参数处理——自动化解析并验证请求参数。
  • 支持请求方式设置——三方框架标配支持 RESTful 风格路由。
  • 生态丰富——主流三方框架生态丰富,很多生态软件都会适配主流框架。