golang优雅打印Go结构体插件库godump的使用
Golang优雅打印Go结构体插件库godump的使用
godump
是一个开发者友好的、零依赖的Go调试打印工具。它提供了漂亮的、带颜色的终端输出,可以打印结构体、切片、映射等,并包含循环引用检测和控制字符转义功能。灵感来源于Symfony的VarDumper,该工具被用于Laravel的dump()
和dd()
等工具中。
✨ 特性
- 🧠 带有可见性标记(
+
,-
)的结构体字段检查 - 🔄 循环安全的引用跟踪
- 🎨 ANSI颜色或HTML输出
- 🧪 处理切片、映射、嵌套结构体、指针、时间等
- 🪄 控制字符转义(
\n
,\t
等)
📦 安装
go get github.com/goforj/godump
🚀 基本用法
package main
import (
"fmt"
"os"
"strings"
"github.com/goforj/godump"
)
type Profile struct {
Age int
Email string
}
type User struct {
Name string
Profile Profile
}
func main() {
user := User{
Name: "Alice",
Profile: Profile{
Age: 30,
Email: "alice@example.com",
},
}
// 漂亮打印到标准输出
godump.Dump(user)
// 获取dump字符串
output := godump.DumpStr(user)
fmt.Println("str", output)
// 获取HTML格式输出(用于Web UI)
html := godump.DumpHTML(user)
fmt.Println("html", html)
// 直接打印JSON到标准输出
godump.DumpJSON(user)
// 写入到任何io.Writer(如文件、缓冲区、日志)
godump.Fdump(os.Stderr, user)
// 打印并退出程序
godump.Dd(user) // 这会打印dump并退出程序
}
🧪 示例输出
<#dump // main.go:26
#main.User
+Name => "Alice"
+Profile => #main.Profile
+Age => 30
+Email => "alice@example.com"
}
}
🏗️ Builder选项用法
package main
import (
"fmt"
"os"
"strings"
"github.com/goforj/godump"
)
type Profile struct {
Age int
Email string
}
type User struct {
Name string
Profile Profile
}
func main() {
user := User{
Name: "Alice",
Profile: Profile{
Age: 30,
Email: "alice@example.com",
},
}
// 自定义Dumper,显式设置所有选项
d := godump.NewDumper(
godump.WithMaxDepth(15), // 默认: 15
godump.WithMaxItems(100), // 默认: 100
godump.WithMaxStringLen(100000), // 默认: 100000
godump.WithWriter(os.Stdout), // 默认: os.Stdout
)
// 使用自定义dumper
d.Dump(user)
// 转储为字符串
out := d.DumpStr(user)
fmt.Printf("DumpStr output:\n%s\n", out)
// 转储为HTML字符串
html := d.DumpHTML(user)
fmt.Printf("DumpHTML output:\n%s\n", html)
// 使用Dumper转储JSON(返回字符串)
jsonStr := d.DumpJSONStr(user)
fmt.Printf("Dumper JSON string:\n%s\n", jsonStr)
// 直接从Dumper打印JSON
d.DumpJSON(user)
// 转储到自定义writer(如字符串构建器)
var sb strings.Builder
custom := godump.NewDumper(godump.WithWriter(&sb))
custom.Dump(user)
fmt.Printf("Dump to string builder:\n%s\n", sb.String())
}
📘 如何阅读输出
godump
输出设计清晰且可追踪。以下是其结构的解释:
🧭 位置头
<#dump // main.go:26
- 第一行显示调用
godump.Dump()
的文件和行号 - 在调试时有助于找到dump发生的位置
🔎 类型名称
#main.User
- 带有包路径的完整结构体名称
🔐 可见性标记
+Name => "Alice"
-secret => "..."
+
→ 导出(公共)字段-
→ 未导出(私有)字段(通过反射访问)
🔄 循环引用
如果指针已经被打印过:
↩︎ &1
- 防止循环结构中的无限循环
- 引用指向较早的对象实例
🔢 切片和映射
0 => "value"
a => 1
- 数组/切片索引和映射键使用
=>
格式和缩进显示 - 如果超过
maxItems
,切片和映射会被截断
🔣 转义字符
"Line1\nLine2\tDone"
- 控制字符如
\n
,\t
,\r
等被安全转义 - 字符串在
maxStringLen
符文后被截断
🧩 支持的类型
- ✅ 结构体(导出和未导出)
- ✅ 指针、接口
- ✅ 映射、切片、数组
- ✅ 通道、函数
- ✅ time.Time(格式良好)
🧩 许可证
MIT © goforj
📇 作者
由Chris Miles创建
作为goforj工具生态系统的一部分维护。
更多关于golang优雅打印Go结构体插件库godump的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang优雅打印Go结构体插件库godump的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
godump - Go结构体优雅打印库
godump 是一个用于优雅打印Go结构体的第三方库,它能够以更可读的方式格式化输出结构体内容,特别适合调试和日志记录场景。
安装
go get github.com/hexdigest/godump
基本用法
package main
import (
"fmt"
"github.com/hexdigest/godump"
)
type User struct {
ID int
Name string
Email string
IsActive bool
Roles []string
}
func main() {
user := User{
ID: 1,
Name: "张三",
Email: "zhangsan@example.com",
IsActive: true,
Roles: []string{"admin", "user"},
}
// 基本打印
fmt.Println("Default print:")
fmt.Println(user)
// 使用godump打印
fmt.Println("\nGodump print:")
godump.Dump(user)
}
输出对比:
Default print:
{1 张三 zhangsan@example.com true [admin user]}
Godump print:
(main.User) {
ID: (int) 1,
Name: (string) "张三",
Email: (string) "zhangsan@example.com",
IsActive: (bool) true,
Roles: ([]string) (len=2 cap=2) {
(string) "admin",
(string) "user"
}
}
高级特性
1. 自定义配置
func main() {
config := godump.Config{
ShowTypes: true, // 显示类型信息
MaxDepth: 3, // 最大递归深度
Indent: " ", // 缩进字符串
FloatFormat: "%.2f", // 浮点数格式
}
user := User{
ID: 1,
Name: "张三",
Email: "zhangsan@example.com",
IsActive: true,
Roles: []string{"admin", "user"},
}
godump.DumpWithConfig(config, user)
}
2. 格式化字符串
func main() {
user := User{
ID: 1,
Name: "张三",
Email: "zhangsan@example.com",
IsActive: true,
Roles: []string{"admin", "user"},
}
// 获取格式化字符串而不直接打印
formatted := godump.Sdump(user)
fmt.Println("Formatted string:")
fmt.Println(formatted)
}
3. 嵌套结构体处理
type Address struct {
City string
Country string
}
type DetailedUser struct {
UserInfo User
HomeAddr Address
WorkAddr *Address
}
func main() {
addr := Address{City: "北京", Country: "中国"}
user := DetailedUser{
UserInfo: User{
ID: 1,
Name: "李四",
Email: "lisi@example.com",
IsActive: true,
},
HomeAddr: addr,
WorkAddr: &addr,
}
godump.Dump(user)
}
实际应用示例
package main
import (
"encoding/json"
"github.com/hexdigest/godump"
"log"
"net/http"
)
type APIResponse struct {
Status int `json:"status"`
Data interface{} `json:"data"`
Message string `json:"message"`
}
type Product struct {
ID int `json:"id"`
Name string `json:"name"`
Price float64 `json:"price"`
Tags []string `json:"tags"`
IsAvailable bool `json:"is_available"`
}
func main() {
// 模拟API响应
product := Product{
ID: 1001,
Name: "Go语言编程",
Price: 99.9,
Tags: []string{"编程", "Go", "计算机"},
IsAvailable: true,
}
response := APIResponse{
Status: http.StatusOK,
Data: product,
Message: "success",
}
// 调试打印
log.Println("API Response:")
godump.Dump(response)
// 转换为JSON
jsonData, err := json.MarshalIndent(response, "", " ")
if err != nil {
log.Fatal(err)
}
log.Println("JSON Output:")
log.Println(string(jsonData))
}
性能考虑
虽然godump提供了友好的输出格式,但在生产环境中频繁调用可能会影响性能。建议:
- 仅在开发调试时使用
- 对性能敏感的场景使用条件编译
// +build debug
package main
import "github.com/hexdigest/godump"
func debugDump(v interface{}) {
godump.Dump(v)
}
// +build !debug
package main
func debugDump(v interface{}) {
// 空实现,生产环境不执行任何操作
}
替代方案
如果godump不满足需求,也可以考虑以下替代方案:
- spew: https://github.com/davecgh/go-spew
- pretty: https://github.com/kr/pretty
- go-spew: https://github.com/davecgh/go-spew
godump以其简洁的API和清晰的输出格式,成为许多Go开发者在调试时的首选工具。合理使用可以大大提高开发效率。