Golang 遍历并修改结构体中的field

需求来源:用一个结构体表示http的请求体,要求对其中的 string 类型的数据进行 trimSpace 处理。
代码示例:

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
package main

import (
"fmt"
"reflect"
"strings"
)

type ReqExample struct {
Name string `json:"name"`
Teacher string `json:"teacher"`
Score int64 `json:"score"`
}

// 对结构体中的 string 类型的 field 进行 trimSpace
// req 是引用类型,因为要对其 field 进行修改
func trimSapce(req interface{}) {
// v := reflect.Indirect(reflect.ValueOf(req))
v := reflect.ValueOf(req).Elem()
for i := 0; i < v.NumField(); i++ {
f := v.Field(i)
if f.Kind() == reflect.String {
s := strings.TrimSpace(f.String())
f.SetString(s)
}
}
}

func main() {
req := ReqExample{
Name: " Oscar ",
Teacher: " Bob Alice ",
Score: 323,
}
fmt.Printf("before: %+v\n", req)
// 因为要修改其中的 field, 所以这里需要传递引用
trimSapce(&req)
fmt.Printf("after : %+v\n", req)
}

// 输出:
// before: {Name: Oscar Teacher: Bob Alice Score:323}
// after : {Name:Oscar Teacher:Bob Alice Score:323}