golang优雅打印Go结构体插件库godump的使用

Golang优雅打印Go结构体插件库godump的使用

godump logo

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提供了友好的输出格式,但在生产环境中频繁调用可能会影响性能。建议:

  1. 仅在开发调试时使用
  2. 对性能敏感的场景使用条件编译
// +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不满足需求,也可以考虑以下替代方案:

godump以其简洁的API和清晰的输出格式,成为许多Go开发者在调试时的首选工具。合理使用可以大大提高开发效率。

回到顶部