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) 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" }
|