golang优雅打印任意变量数据的插件库godump的使用

golang优雅打印任意变量数据的插件库godump的使用

godump 是一个多功能的 Go 库,旨在以结构化和彩色格式输出任何 Go 变量。当标准 fmt 库在有效显示任意数据方面不足时,这个库特别适用于调试和测试。它也可以作为一个强大的日志记录适配器,为开发和生产环境提供清晰可读的日志。

为什么选择 godump

  • 能够漂亮地打印所有类型的值
  • 格式良好的输出
  • 也会转储未导出的结构体字段
  • 跟踪指针,并考虑递归指针
  • 可定制,您可以完全控制输出,甚至可以生成 HTML
  • 零依赖

快速开始

安装库:

go get -u github.com/yassinebenaid/godump

然后使用 Dump 函数:

package main

import (
	"github.com/yassinebenaid/godump"
)

func main() {
	godump.Dump("Anything")
}

自定义

如果您需要更多控制输出,可以使用 Dumper

package main

import (
	"os"

	"github.com/yassinebenaid/godump"
)

func main() {
	var v = "Foo Bar"
	var d = godump.Dumper{
		Indentation:       "  ",
		HidePrivateFields: false,
		ShowPrimitiveNamedTypes: false,
		Theme: godump.Theme{
			String: godump.RGB{R: 138, G: 201, B: 38},
			// ...
		},
	}

	d.Print(v)
	d.Println(v)
	d.Fprint(os.Stdout, v)
	d.Fprintln(os.Stdout, v)
	d.Sprint(v)
	d.Sprintln(v)
}

示例

示例 1

package main

import (
	"os"

	"github.com/yassinebenaid/godump"
)

func main() {
	godump.Dump(os.Stdout)
}

输出: stdout

示例 2

package main

import (
	"net"

	"github.com/yassinebenaid/godump"
)

func main() {
	godump.Dump(net.Dialer{})
}

输出: dialer

示例 3

这个例子展示了如何处理递归指针。

package main

import (
	"github.com/yassinebenaid/godump"
)

func main() {
	type User struct {
		Name       string
		age        int
		BestFriend *User
	}

	me := User{
		Name: "yassinebenaid",
		age:  22,
	}

	// 创建一个循环引用
	me.BestFriend = &me

	godump.Dump(me)
}

输出: pointer

示例 4

这个例子强调如何生成HTML。

package main

import (
	"fmt"
	"net"
	"net/http"

	"github.com/yassinebenaid/godump"
)

// 定义自定义样式实现
type CSSColor struct {
	R, G, B int
}

func (c CSSColor) Apply(s string) string {
	return fmt.Sprintf(`<div style="color: rgb(%d, %d, %d); display: inline-block">%s</div>`, c.R, c.G, c.B, s)
}

func main() {
	var d godump.Dumper

	d.Theme = godump.Theme{
		String:        CSSColor{138, 201, 38}, // 编辑主题以使用您的实现
		Quotes:        CSSColor{112, 214, 255},
		Bool:          CSSColor{249, 87, 56},
		Number:        CSSColor{10, 178, 242},
		Types:         CSSColor{0, 150, 199},
		Address:       CSSColor{205, 93, 0},
		PointerTag:    CSSColor{110, 110, 110},
		Nil:           CSSColor{219, 57, 26},
		Func:          CSSColor{160, 90, 220},
		Fields:        CSSColor{189, 176, 194},
		Chan:          CSSColor{195, 154, 76},
		UnsafePointer: CSSColor{89, 193, 180},
		Braces:        CSSColor{185, 86, 86},
	}

	html := `<pre style="background: #111; padding: 10px; color: white">`
	html += d.Sprint(net.Dialer{})
	html += "</pre>"

	// 渲染到浏览器
	http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
		w.Header().Set("Content-Type", "text/html")
		fmt.Fprint(w, html)
	})

	http.ListenAndServe(":8000", nil)
}

输出: theme

更多示例,请查看 dumper_test 和 testdata 目录。


更多关于golang优雅打印任意变量数据的插件库godump的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于golang优雅打印任意变量数据的插件库godump的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


使用 godump 优雅打印任意变量数据

godump 是一个 Go 语言开发的用于优雅打印任意变量数据的库,它能够以结构化的方式输出变量的内容,特别适合调试和日志记录场景。

安装 godump

go get github.com/hexdigest/godump

基本用法

package main

import (
	"github.com/hexdigest/godump"
)

type Person struct {
	Name    string
	Age     int
	Address struct {
		Street string
		City   string
	}
}

func main() {
	p := Person{
		Name: "Alice",
		Age:  30,
		Address: struct {
			Street string
			City   string
		}{
			Street: "123 Main St",
			City:   "New York",
		},
	}

	// 基本打印
	godump.Dump(p)

	// 带标签打印
	godump.DumpWithTag("Person Info", p)

	// 获取格式化字符串而不直接打印
	str := godump.Sdump(p)
	println(str)
}

高级功能

1. 自定义输出格式

func main() {
	complexData := map[string]interface{}{
		"name": "Bob",
		"age":  25,
		"hobbies": []string{
			"reading", "swimming", "coding",
		},
		"metadata": map[string]interface{}{
			"created_at": "2023-01-01",
			"updated_at": "2023-05-15",
		},
	}

	// 自定义配置
	config := godump.Config{
		ShowTypes:      true,  // 显示类型信息
		MaxDepth:       3,     // 最大递归深度
		Indent:         "    ", // 缩进字符串
		ColonSeparator: " => ", // 键值分隔符
	}

	godump.DumpWithConfig(config, complexData)
}

2. 打印函数信息

func exampleFunction(a int, b string) (bool, error) {
	return true, nil
}

func main() {
	// 打印函数信息
	godump.Dump(exampleFunction)
}

3. 打印通道和指针

func main() {
	ch := make(chan int, 5)
	ch <- 1
	ch <- 2

	var ptr *int
	num := 42
	ptr = &num

	godump.Dump(ch)
	godump.Dump(ptr)
}

实际应用示例

package main

import (
	"encoding/json"
	"net/http"
	"net/http/httptest"

	"github.com/hexdigest/godump"
)

type User struct {
	ID       int    `json:"id"`
	Username string `json:"username"`
	Email    string `json:"email"`
}

func getUserHandler(w http.ResponseWriter, r *http.Request) {
	user := User{
		ID:       1,
		Username: "johndoe",
		Email:    "john@example.com",
	}

	// 在返回前打印用户数据
	godump.DumpWithTag("Response User", user)

	w.Header().Set("Content-Type", "application/json")
	json.NewEncoder(w).Encode(user)
}

func main() {
	req := httptest.NewRequest("GET", "/user", nil)
	w := httptest.NewRecorder()

	getUserHandler(w, req)

	// 打印响应
	godump.DumpWithTag("HTTP Response", map[string]interface{}{
		"Status": w.Result().Status,
		"Body":   w.Body.String(),
	})
}

性能考虑

虽然 godump 非常方便,但在生产环境中大量使用时需要注意:

  1. 对于性能敏感的场景,考虑仅在调试时使用
  2. 可以通过环境变量控制是否启用 godump
  3. 对于大型数据结构,限制打印深度
func debugDump(data interface{}) {
	if os.Getenv("DEBUG") == "true" {
		godump.DumpWithConfig(godump.Config{
			MaxDepth: 2,
		}, data)
	}
}

godump 是一个简单但功能强大的调试工具,能够帮助开发者快速理解复杂数据结构的内容,特别适合在开发和测试阶段使用。

回到顶部