go打印嵌套的复杂结构体

go打印嵌套的复杂结构体

这个需求其实在日常写代码中比较常见,比如调一个接口返回来一个结果,
这时想看一下这个变量有什么内容
假如使用fmt的%v 或者 %+v, 那只能打印简单类型的结构体,对于嵌套的复杂结构体就不行了。

而使用反射去一层一层解析又太麻烦,我想找一种简单方便的方式。
昨天中午正在吃饭时,突然想到可以通过json的Marshal方式输出变量的内容。

写一下示例代码:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
type User struct {
	Name string
	Age  int
	Home *Home
}

type Home struct {
	Address     string
	PeopleLives []string
	PeopleInfo  map[string]string
}

// 输出一个结构体嵌套的变量
func GenTestUser() *User {
	ho := Home{}
	ho.Address = "beijing"
	ho.PeopleLives = []string{
		"Raman Kalita", "Abhishek Garg",
	}
	ho.PeopleInfo = map[string]string{
		"Raman Kalita":  "civil servant",
		"Abhishek Garg": "teacher",
	}
	us := User{}
	us.Name = "Alise"
	us.Age = 31
	us.Home = &ho
	return &us
}

func Test_PrintJson(t *testing.T) {
	us := GenTestUser()
	PrintJson(us)
}

// PrintJson 通过json序列化打印数据内容
func PrintJson(in interface{}) {
	res, err := json.MarshalIndent(in, "", "\t") // beautiful json
	if err != nil {
		log.Error().Stack().Err(err).Send()
		return
	}
	Printf(string(res))
}

输出的结果:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
{
	"Name": "Alise",
	"Age": 31,
	"Home": {
		"Address": "beijing",
		"PeopleLives": [
			"Raman Kalita",
			"Abhishek Garg"
		],
		"PeopleInfo": {
			"Abhishek Garg": "teacher",
			"Raman Kalita": "civil servant"
		}
	}
}

可以看到Home这个结构体也打印出来了,无论是map还是slice输出都是OK的, PrintJson这个函数才几行? 简单好用~

Licensed under CC BY-NC-SA 4.0
最后更新于 2025-05-27 01:51:43
使用 Hugo 构建
主题 StackJimmy 设计