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)
}
输出:
示例 2
package main
import (
"net"
"github.com/yassinebenaid/godump"
)
func main() {
godump.Dump(net.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)
}
输出:
示例 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)
}
输出:
更多示例,请查看 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 非常方便,但在生产环境中大量使用时需要注意:
- 对于性能敏感的场景,考虑仅在调试时使用
- 可以通过环境变量控制是否启用 godump
- 对于大型数据结构,限制打印深度
func debugDump(data interface{}) {
if os.Getenv("DEBUG") == "true" {
godump.DumpWithConfig(godump.Config{
MaxDepth: 2,
}, data)
}
}
godump 是一个简单但功能强大的调试工具,能够帮助开发者快速理解复杂数据结构的内容,特别适合在开发和测试阶段使用。