原理

使用 Gin 框架 通过 http get 请求触发某包 某方法的执行操作, 从而返回数据
适合在程序运行不退出的情况下进行交互调试
配合 go-spew 使用效果更佳 https://github.com/davecgh/go-spew

Go 工程目录结构

  1. .
  2. |-- go.mod
  3. |-- go.sum
  4. |-- main.go
  5. `-- testPackage
  6. `-- testPackage.go
  7. 1 directory, 4 files

第五行为要调试的包

Go 文件 testPackage.go

  1. package testPackage
  2. import (
  3. "fmt"
  4. )
  5. // 调试专用map
  6. var bug = make(map[string]interface{})
  7. // Http 请求调试入口
  8. func Debug() (i interface{}) {
  9. // 使用 http 访问进行某个包中某个方法的触发
  10. bug["person1"] = Person1{
  11. Name: "罗文猛",
  12. Age: 23,
  13. Sex: true,
  14. }
  15. bug["person2"] = GetTest()
  16. bug["person3"] = "罗文猛 23 true"
  17. fmt.Println(bug)
  18. return bug
  19. }
  20. // 包中的某个函数
  21. func GetTest() (ret2 interface{}) {
  22. // 匿名函数
  23. type Person2 struct {
  24. Name string `json:"name"`
  25. Age int
  26. sex bool // 男=true
  27. }
  28. person2 := Person2{
  29. Name: "罗文猛",
  30. Age: 23,
  31. sex: true,
  32. }
  33. return person2
  34. }
  35. type Person1 struct {
  36. Name string
  37. Age int `json:"age"`
  38. Sex bool
  39. }

注意 29 行的匿名 结构体 Person2 将属性 sex 设置成了小写, 等下在 Http 触发调试中将不会显示

文件 main.go

  1. package main
  2. import (
  3. "gin-debug/testPackage"
  4. "github.com/gin-gonic/gin"
  5. )
  6. func main() {
  7. r := gin.Default()
  8. // 使用 http 访问进行某个包中某个方法的触发
  9. r.GET("/debug/testPackage", func(c *gin.Context) {
  10. c.Header("Content-Type", "application/json")
  11. c.JSON(200, testPackage.Debug())
  12. })
  13. r.Run(":8080")
  14. }

使用HTTP 请求触发调试

  1. // 20211226004502
  2. // http://192.168.66.104:8080/debug/testPackage
  3. {
  4. "person1": {
  5. "Name": "罗文猛",
  6. "age": 23,
  7. "Sex": true
  8. },
  9. "person2": {
  10. "name": "罗文猛",
  11. "Age": 23
  12. },
  13. "person3": "罗文猛 23 true"
  14. }

可以注意到 第10 行的对象 person2 没有了性别 sex

就是是说被调试的数据必须遵循导出原则

推荐浏览器上安装插件 JSON Viewer

可以展开折叠 JSON 数据, 方便调试
Chrome 商店下载 https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh
image.png