https://github.com/mcuadros/go-defaults

效果

原golang结构体订单的字符串或布尔值,序列化得到的默认值会是空字符串或false;
golang json序列化结构体的时候,json存在的字段会保留,如果json不存在的字段,将会拿结构体tags标签的default为默认值

坑:如果有用json.Unmarshal,defaults.SetDefaults必须在其前面执行

安装

go get github.com/mcuadros/go-defaults

例子

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
type SetDefault struct {
Name string `json:"name"`
Gender int `json:"gender" default:"1"`
InSchool bool `json:"in_school" default:"true"`
}

const DefaultJson1 = `{"name": "张三","gender": 1}`
const DefaultJson2 = `{"name": "李四","gender": 1,"in_school": false}`

func (t Test) DefaultValue(ctx *gin.Context) {
exp := new(SetDefault)
defaults.SetDefaults(exp)
// var exp SetDefault
// defaults.SetDefaults(&exp)
err := json.Unmarshal([]byte(DefaultJson1), &exp)
if err != nil {
ctx.JSON(http.StatusOK, gin.H{
"code": http.StatusBadRequest,
"message": err,
})
return
}
ctx.JSON(http.StatusOK, gin.H{
"code": http.StatusOK,
"message": "ok",
"data": exp,
})
}

DefaultJson1返回数据,in_school在json字符串中不存在,获取结构体定义的默认值

1
2
3
4
5
6
7
8
9
{
"code": 200,
"data": {
"name": "张三",
"gender": 1,
"in_school": true
},
"message": "ok"
}

DefaultJson2返回数据,json字符串都有相关值,则以原数据为主

1
2
3
4
5
6
7
8
9
{
"code": 200,
"data": {
"name": "李四",
"gender": 2,
"in_school": false
},
"message": "ok"
}