明白了,你是想在 Gin 启动时打印出所有已注册的路由列表(比如类似[GIN-debug] GET /api/users/:id这样的输出)。
Gin 本身在gin.Default()模式下会自动打印路由信息,但如果你想自定义格式(比如输出成 JSON、表格,或者写入日志文件),可以通过覆盖gin.DebugPrintRouteFunc来实现。
方法一:自定义路由打印格式(推荐)
在r.Run()之前设置gin.DebugPrintRouteFunc:
package main import ( "fmt" "log" "net/http" "github.com/gin-gonic/gin" ) func main() { r := gin.Default() // 自定义路由打印格式 gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { // 你可以改成任何你喜欢的格式,比如 JSON、表格等 log.Printf("[ROUTE] %-6s %-30s --> %s (%d handlers)", httpMethod, absolutePath, handlerName, nuHandlers) } r.GET("/api/users/:id", getUser) r.POST("/api/users", createUser) r.PUT("/api/users/:id", updateUser) r.DELETE("/api/users/:id", deleteUser) r.Run(":8080") }启动后输出类似:
2026/09/20 10:00:00 [ROUTE] GET /api/users/:id --> main.getUser (3 handlers) 2026/09/20 10:00:00 [ROUTE] POST /api/users --> main.createUser (3 handlers) 2026/09/20 10:00:00 [ROUTE] PUT /api/users/:id --> main.updateUser (3 handlers) 2026/09/20 10:00:00 [ROUTE] DELETE /api/users/:id --> main.deleteUser (3 handlers)方法二:输出为 JSON 格式(方便日志收集)
gin.DebugPrintRouteFunc = func(httpMethod, absolutePath, handlerName string, nuHandlers int) { type RouteInfo struct { Method string `json:"method"` Path string `json:"path"` HandlerName string `json:"handler_name"` Handlers int `json:"handlers_count"` } info := RouteInfo{ Method: httpMethod, Path: absolutePath, HandlerName: handlerName, Handlers: nuHandlers, } data, _ := json.Marshal(info) fmt.Println(string(data)) }输出:
{"method":"GET","path":"/api/users/:id","handler_name":"main.getUser","handlers_count":3}方法三:收集所有路由到切片(运行时查询)
如果你想在程序运行时动态获取所有已注册的路由(比如提供一个/debug/routes接口),可以遍历r.Routes():
func main() { r := gin.Default() r.GET("/api/users/:id", getUser) r.POST("/api/users", createUser) // 提供一个调试接口,返回所有已注册路由 r.GET("/debug/routes", func(c *gin.Context) { routes := r.Routes() // 返回 []gin.RouteInfo c.JSON(200, routes) }) r.Run(":8080") }访问http://localhost:8080/debug/routes会得到:
[ { "Method": "GET", "Path": "/api/users/:id", "Handler": "main.getUser" }, { "Method": "POST", "Path": "/api/users", "Handler": "main.createUser" }, { "Method": "GET", "Path": "/debug/routes", "Handler": "main.main.func1" } ]总结
| 需求 | 方法 |
|---|---|
| 启动时自定义格式打印 | 覆盖gin.DebugPrintRouteFunc |
| 运行时动态获取路由列表 | 使用r.Routes() |
| 默认打印(无需自定义) | 使用gin.Default()即可,会自动输出 |
你具体是想在哪个场景下打印?启动日志、调试接口、还是写入日志文件?我可以帮你进一步调整。