本文共 2575 字,大约阅读时间需要 8 分钟。
在接口开发中,很多时候返回的数据是基于一个数据表的,但是又不仅限与该表的字段,由于golang是强类型的语言,于是这个model就显得不好设计了。
比如想要返回类似于这样的数据:
{ "code": 0, "data": { "id": 0, "name": "TP-01", "votestart": 1599580800000, "voteend": 1606751999000, "start_url": "", "config_list": { "category_name": "全部1", "color_list": [ "#6AE0D0", "#31947E" ], "digital_code": 0, "mv_name": "视频2222", "phone_login": 1, "select_max": 20, "show_share": 1, "vote_rule": "1", "vote_type": 1, }, "status": 1, "ext": "", "product_num": 0, "category_list": [ { "id": 10, "name": "少年组" }, { "id": 11, "name": "中年组" }, { "id": 12, "name": "老年组" } ] }, "msg": ""}
很显然一个普通的model是无法满足这个需求的。
于是定义了如下的结构体:
type Vote2ActivityModel struct { Id int `json:"id" primaryKey:"true"` Name string `json:"name"` VotestartStr string `json:"-" gorm:"column:votestart"` VoteendStr string `json:"-" gorm:"column:voteend"` Votestart int64 `json:"votestart" gorm:"-"` Voteend int64 `json:"voteend" gorm:"-"` StartUrl string `json:"start_url"` ConfigListStr string `json:"-" gorm:"column:config_list"` ConfigListMap interface{ } `json:"config_list" gorm:"-"` Status int `json:"status"` Ext string `json:"ext"` ProductNum int `json:"product_num"` CategoryList interface{ } `json:"category_list" gorm:"-"`}
说明:
json:"-" 表示此结构体字段,在转换成json串的时候,过滤掉此字段。json:"votestart" 表示此结构体字段,对应json串中的votestart字段。gorm:"column:votestart" 表示此结构体字段,对应数据表的votestart字段,在查询的时候需要严格匹配字段类型,并填充数据,如果类型不匹配将会报错。gorm:"-" 表示此结构体字段,不需要匹配数据表的任何字段,因此你可以定义为任何复杂的数据类型。
字段说明:
1、votestart 在数据表中存储的是字符串 2020-09-17 00:00:00 ,但是需要返回整型的,于是便有了VotestartStr string `json:"-" gorm:"column:votestart"`Votestart int64 `json:"votestart" gorm:"-"`
先将votestart加载到VotestartStr,然后转换成整型填充到Votestart,最终只导出Votestart即可。
2、config_list
在数据表中config_list存储的是json串,但是需要json.Unmarshal之后再返回,于是便有了ConfigListStr string `json:"-" gorm:"column:config_list"`ConfigListMap interface{ } `json:"config_list" gorm:"-"`
3、category_list
是关联的另一张表的数据。CategoryList interface{ } `json:"category_list" gorm:"-"`
不一定都要使用interface{}来替代,如果明确知道类型,最后填对应的类型,这样这个模型在使用起来会更方便。
转载地址:http://ocaui.baihongyu.com/