expvar
包为程序中的公共变量提供了一个标准化的接口,如服务中的访问计数器。包提供了 HTTP 接口并以 JSON 格式输出这些变量,接口的 URL 路由是 /debug/vars
。
最重要的是,操作这些公共变量是原子的,这意味着我们不需要考虑并发带来的问题。
例子
接口状态码计数器
package main
import (
"expvar"
"fmt"
"log"
"math/rand"
"net/http"
"time"
)
var (
ok = expvar.NewInt("200") // 200 计算器
notFound = expvar.NewInt("404") // 404 计数器
serverError = expvar.NewInt("500") // 500 计数器
)
func helloWorld(w http.ResponseWriter, r *http.Request) {
_, err := fmt.Fprintf(w, "hello world")
if err != nil {
log.Fatal(err)
}
ok.Add(1) // 增加 200 计数器
}
// 为了模拟 404, 500 错误
// 随机返回 Http Code [200, 404, 500]
func random(w http.ResponseWriter, r *http.Request) {
rand.Seed(time.Now().UnixNano())
n := rand.Intn(3)
var code int
switch n {
case 0:
code = http.StatusOK
ok.Add(1) // 增加 200 计数器
case 1:
code = http.StatusNotFound
notFound.Add(1) // 增加 404 计数器
case 2:
code = http.StatusInternalServerError
serverError.Add(1) // 增加 500 计数器
}
w.WriteHeader(code)
}
func main() {
http.HandleFunc("/", helloWorld) // 默认返回地址
http.HandleFunc("/random", random) // 随机返回状态码地址
log.Fatal(http.ListenAndServe(":8080", nil))
}
标签:code,http,计数器,404,Go,工程化,expvar,500
From: https://www.cnblogs.com/cheyunhua/p/17102790.html