1.resty

github链接:https://github.com/go-resty/resty/
使用:import “github.com/go-resty/resty/v2”
Resty包是一个很棒的http client库,封装了golang自带的http方法,

使用方法

  1. //get方法
  2. client := resty.New()
  3. resp, err := client.R().//R()方法是创建一个Request实例
  4. SetQueryParams(map[string]string{//必须是map[string]string
  5. "page_no": "1",
  6. "limit": "20",
  7. "sort":"name",
  8. "order": "asc",
  9. "random":strconv.FormatInt(time.Now().Unix(), 10),
  10. }).//也可以使用SetQueryString(),使用&拼接
  11. SetHeader("Accept", "application/json").
  12. SetContext(context.Background()).
  13. SetResult(&result).//result实例,可以自动解析json
  14. Get(url)
  1. //post方法
  2. client := resty.New()
  3. // No need to set content type, if you have client level setting
  4. resp, err := client.R().
  5. EnableTrace().//配置trace
  6. SetTimeout(24*60).//设置超时时间
  7. SetHeader("Content-Type", "application/json").
  8. SetBody(`{"username":"testuser", "password":"testpass"}`).
  9. //一般使用map[string]interface{}的结构或者[]byte
  10. SetResult(&AuthSuccess{}). // or SetResult(AuthSuccess{}).
  11. SetContext(context.Background()).
  12. Post("https://myapp.com/login")

返回内容解析

  1. client := resty.New()
  2. resp, err := client.R().
  3. EnableTrace().
  4. Get("https://httpbin.org/get")
  5. // Explore response object
  6. fmt.Println("Response Info:")
  7. fmt.Println(" Error :", err)//nil
  8. fmt.Println(" Status Code:", resp.StatusCode())
  9. fmt.Println(" Status :", resp.Status())
  10. fmt.Println(" Proto :", resp.Proto())
  11. fmt.Println(" Time :", resp.Time())
  12. fmt.Println(" Received At:", resp.ReceivedAt())
  13. fmt.Println(" Body :\n", resp)
  14. fmt.Println()
  15. // Explore trace info
  16. fmt.Println("Request Trace Info:")
  17. ti := resp.Request.TraceInfo()
  18. fmt.Println(" DNSLookup :", ti.DNSLookup)
  19. fmt.Println(" ConnTime :", ti.ConnTime)
  20. fmt.Println(" TCPConnTime :", ti.TCPConnTime)
  21. fmt.Println(" TLSHandshake :", ti.TLSHandshake)
  22. fmt.Println(" ServerTime :", ti.ServerTime)
  23. fmt.Println(" ResponseTime :", ti.ResponseTime)
  24. fmt.Println(" TotalTime :", ti.TotalTime)
  25. fmt.Println(" IsConnReused :", ti.IsConnReused)
  26. fmt.Println(" IsConnWasIdle :", ti.IsConnWasIdle)
  27. fmt.Println(" ConnIdleTime :", ti.ConnIdleTime)
  28. fmt.Println(" RequestAttempt:", ti.RequestAttempt)
  29. fmt.Println(" RemoteAddr :", ti.RemoteAddr.String())
  30. /*
  31. Response Info:
  32. Error : <nil>
  33. Status Code: 200
  34. Status : 200 OK
  35. Proto : HTTP/2.0
  36. Time : 457.034718ms
  37. Received At: 2020-09-14 15:35:29.784681 -0700 PDT m=+0.458137045
  38. Body :
  39. {
  40. "args": {},
  41. "headers": {
  42. "Accept-Encoding": "gzip",
  43. "Host": "httpbin.org",
  44. "User-Agent": "go-resty/2.4.0 (https://github.com/go-resty/resty)",
  45. "X-Amzn-Trace-Id": "Root=1-5f5ff031-000ff6292204aa6898e4de49"
  46. },
  47. "origin": "0.0.0.0",
  48. "url": "https://httpbin.org/get"
  49. }
  50. Request Trace Info:
  51. DNSLookup : 4.074657ms
  52. ConnTime : 381.709936ms
  53. TCPConnTime : 77.428048ms
  54. TLSHandshake : 299.623597ms
  55. ServerTime : 75.414703ms
  56. ResponseTime : 79.337µs
  57. TotalTime : 457.034718ms
  58. IsConnReused : false
  59. IsConnWasIdle : false
  60. ConnIdleTime : 0s
  61. RequestAttempt: 1
  62. RemoteAddr : 3.221.81.55:443
  63. */

2.logrus

logrus是golang常使用的log框架之一
https://github.com/sirupsen/logrus
https://blog.csdn.net/wslyk606/article/details/81670713

  1. 完全兼容golang标准库日志模块。logrus拥有六种日志级别:debug、info、warn、error、fatal和panic,这是golang标准库日志模块的API的超集。如果你的项目使用标准库日志模块,完全可以用最低的代价迁移到logrus上。
  2. 可扩展的Hook机制。允许使用者通过hook方式,将日志分发到任意地方,如本地文件系统、标准输出、logstash、elasticsearch或者mq等,或者通过hook定义日志内容和格式等。
  3. 可选的日志输出格式。logrus内置了两种日志格式,JSONFormatter和TextFormatter。如果这两个格式不满足需求,可以自己动手实现接口Formatter,来定义自己的日志格式。
  4. Field机制。logrus鼓励通过Field机制进行精细化、结构化的日志记录,而不是通过冗长的消息来记录日志。
  5. logrus是一个可插拔的、结构化的日志框架。
  6. 低层通过sync.Mutex加锁来实现线程安全 ```go import “github.com/sirupsen/logrus”

func main(){ logrus.SetLevel(logrus.TraceLevel)//设置日志级别 logrus.SetFormatter(&logrus.TextFormatter{})//设置输出格式 text or json logrus.AddHook(Hook())//添加hook,需要实现fire和Levels两个接口,可以使用第三方hook log.WithFields(logrus.Fields{ “errMsg”: “test err”, }).Info(“test error”) }

//type Hook interface { // Levels() []Level 记录Levels()返回的日志级别的消息时会触发HOOK, // Fire(*Entry) error 按照Fire方法定义的内容修改logrus.Entry。 //}

  1. **行号和文件名的支持**<br />一就是自己实现一个hook;二就是通过装饰器包装logrus.Entry<br />**输出到本地文件系统时的日志分割功能**<br />通过file-rotatelogs进行日志本地文件分割
  2. ```go
  3. func ConfigLocalFilesystemLogger(logPath string, logFileName string, maxAge time.Duration, rotationTime time.Duration) {
  4. baseLogPaht := path.Join(logPath, logFileName)
  5. writer, err := rotatelogs.New(
  6. baseLogPaht+".%Y%m%d%H%M",
  7. // 生成软链,指向最新日志文件
  8. rotatelogs.WithLinkName(baseLogPaht),
  9. // WithMaxAge和WithRotationCount只能设置一个
  10. // WithMaxAge文件最大保存时间
  11. // WithRotationCount最大保存数量
  12. rotatelogs.WithMaxAge(maxAge),
  13. // 日志切割时间间隔
  14. rotatelogs.WithRotationTime(rotationTime),
  15. )
  16. if err != nil {
  17. log.Errorf("config local file system logger error: %+v", err)
  18. }
  19. lfHook := lfshook.NewHook(lfshook.WriterMap{
  20. log.DebugLevel: writer, // 为不同级别设置不同的输出目的
  21. log.InfoLevel: writer,
  22. log.WarnLevel: writer,
  23. log.ErrorLevel: writer,
  24. log.FatalLevel: writer,
  25. log.PanicLevel: writer,
  26. },&log.TextFormatter{})
  27. log.AddHook(lfHook)
  28. }

输出到ELK等日志处理中心的功能

  1. import (
  2. "github.com/olivere/elastic"
  3. "gopkg.in/sohlich/elogrus"
  4. )
  5. func initLog() {
  6. client, err := elastic.NewClient(elastic.SetURL("http://localhost:9200"))
  7. if err != nil {
  8. log.Panic(err)
  9. }
  10. hook, err := elogrus.NewElasticHook(client, "localhost", log.DebugLevel, "mylog")//elogrus第三方hook
  11. if err != nil {
  12. log.Panic(err)
  13. }
  14. log.AddHook(hook)
  15. }
  16. /**
  17. https://github.com/vladoatanasov/logrus_amqp
  18. Logrus hook for Activemq。
  19. https://github.com/bshuster-repo/logrus-logstash-hookk
  20. Logstash hook for logrus。
  21. https://github.com/weekface/mgorus
  22. Mongodb Hooks for Logrus。
  23. https://github.com/abramovic/logrus_influxdb
  24. InfluxDB Hook for Logrus。
  25. https://github.com/rogierlommers/logrus-redis-hook
  26. Hook for Logrus which enables logging to RELK stack (Redis, Elasticsearch, Logstash and Kibana)。
  27. */

3.excelize

excelize是golang处理excel的类库
import “github.com/xuri/excelize/v2”
文档:https://xuri.me/excelize/zh-hans/

  1. f := excelize.NewFile()
  2. sheetName := "testSheet"
  3. f.NewSheet(sheetName)
  4. //列表类型建议这么做
  5. titles := []string{"name", "age", "phone"}
  6. err = f.SetSheetRow(sheetName, "A1", &titles)
  7. if err != nil{
  8. fmt.Println(err)
  9. return
  10. }
  11. for i, l := range list {
  12. axis := i + 2
  13. datas := []interface{}{
  14. l.name,
  15. l.age,
  16. l.phone,
  17. }
  18. err = f.SetSheetRow(sheetName, fmt.Sprintf("A%d", axis), &datas)
  19. if err != nil {
  20. fmt.Println(err)
  21. return
  22. }
  23. }

4.gjson

gjson是get json的缩写,它只能用用于解析json字符串,但不能用于序列号。官方的 JSON 解析库需要传两个参数,一个是需要被序列化的对象,另一个是表示这个对象的类型。
在真正执行 JSON 解析之前会调用 reflect.ValueOf来获取参数 v 的反射对象。然后会获取到传入的 data 对象的开头非空字符来界定该用哪种方式来进行解析,由于用到了反射,性能较低

  1. func main(){
  2. json := `{
  3. "name":"rzy",
  4. "age":25
  5. }`
  6. name := gjson.Get(json,"name")
  7. if !gjson.Valid(json){
  8. fmt.Sprintf("json invalid")
  9. }
  10. // 输出 json 行数组的长度
  11. log.Println(gjson.Get(json, "..#"))
  12. // 输出 json 行 数组的第 3 行
  13. log.Println(gjson.Get(json, "..2"))
  14. // 输出 json 每一行 里面的 author 对应的值,组成一个数组
  15. log.Println(gjson.Get(json, "..#.name"))
  16. // 输出输出 json 行 中,author = xiaomotong 所在行
  17. log.Println(gjson.Get(json, `..#(name="rzy")`))
  18. // 遍历 json 行
  19. gjson.ForEachLine(json, func(jLine gjson.Result) bool {
  20. log.Println("author:", gjson.Get(jLine.String(), "hobby"))
  21. return true
  22. })
  23. }