打卡《4个秒杀Go官方库的第三方开源库》

211 阅读3分钟

fasthttp

其号称比net/http包快十倍!

在了解fasthttp前,先对net/http包进行了解

net/http: 由go内置的包,它提供了HTTP客户端和服务端的实现,通过http.HandleFunc()http.ListenAndServe()两个函数就可以轻松创建一个简单的Go web服务器

//简单的服务端实现
package main
 
 import (
     "fmt"
     "net/http"
 )
 
 func hello(w http.ResponseWriter, r *http.Request) {
     fmt.Fprintf(w, "Hello!")
 }
 
 func main() {
     //关联路径和方法
     http.HandleFunc("/hello", hello)
     //设置监听端口,第二个参数的事件处理器,默认使用多路复用器
     //多路复用器原理:根据请求的URL地址找到对应的处理器,调用处理器对应的ServeHTTP()方法处理请求。
     //定义一个自己的处理器myHanlder := http.NewServeMux()
     http.ListenAndServe(":8080", nil)
 }
​
/**
也可以这样进行详细的配置
 s := &http.Server{
     Addr:           ":8082",
     Handler:        myHandler,
     ReadTimeout:    10 * time.Second,
     WriteTimeout:   10 * time.Second,
     MaxHeaderBytes: 1 << 20,
 }
*/

响应流程如下:

  1. 客户端发送请求
  2. 服务器的多路复用器收到请求
  3. 多路复用器根据请求的URL找到注册的处理器,将请求交由处理器处理
  4. 处理器执行程序逻辑,与数据库交互
  5. 调用模板引擎选择模板
  6. 服务器端将数据通过Http响应返回给客户端
  7. 客户端拿到数据呈现给用户

fasthttp之所以能比net/http快,只要是由于复用:

  • 复用 goroutine(协程),减轻 runtime(类似jvm,在编译时,go会将runtime部分代码连接进去) 压力;
  • 对象复用,大量使用 sync.Pool (go提供的内存池,里面的对象进行复用)减轻 GC 压力。

jsoniter:一款快且灵活的 JSON 解析器,据说比go的官方库快6倍,且完全兼容。尽量减少不必要的内存复制,同时减少reflect的使用——同一类型的对象,jsoniter只调用reflect解析一次之后即缓存下来

官方库为encoding/json,是go提供的JSON转换库

ProtoBuf : gogo/protobuf 是由 Google 开发和定义的与 XML、JSON 类似的一种协议格式,用于高效存储与读取结构化数据。它基于二进制,因此使用 ProtoBuf 能将数据压缩得更小。(官方库为goland/protobuf)

gogoproto 的概念简单而吸引人。他们在 proto 声明中使用自定义扩展,从而为 Go 量身定制更好的代码生成。特别是如果你放弃一些协议缓冲区合约

gogo/protobuf是基于官方库golang/protobuf的增强版实现:

  • 比golang/protobuf更快地序列化与反序列化;
  • 更规范的 Go 结构;
  • 兼容golang/protobuf;
  • 可选地生成额外的帮助代码,减少代码输入;
  • 可以生成测试代码和 benchmark 代码;
  • 其他序列化格式;

valyala/quicktemplate

quicktemplate会先将编写的模板代码转换为 Go 语言代码,再进行编译渲染。因此,它比标准库html/template快 20 倍以上。

quicktemplate的语法与 Go 语法非常类似,几乎没有学习成本。

几乎所有的 bug 都能在模板编译时被捕获,因此在实际项目中,很少会有受模板相关的bug影响。

模板中可以嵌入任意 Go 代码。

  • Golang的html/template包实现了数据驱动的模板,用于生成可对抗代码注入且安全HTML输出。