線上服務器,同一個web接口有時需要兼容不同版本的結構體。這種情況思路是使用interface{}接收任意類型數據,結合reflect包處理。
如下,http接口調用者會傳入不同的json結構數據(單體結構或切片結構):
type ReqStu struct {
XXX struct { //XXX結構為單體
AAA string `json:"aaa"`
BBB string `json:"bbb"`
CCC string `json:"ccc"`
} `json:"xxx"`
}
type ReqStu struct {
XXX []struct { //XXX為數據體切片
AAA string `json:"aaa"`
BBB string `json:"bbb"`
CCC string `json:"ccc"`
} `json:"xxx"`
}
兼容不同XXX結構體的方法是使用interface{},接收任意類型數據。
type ReqStu struct {
XXX interface{} `json:"xxx"`
}
代碼實現方面,使用反射判斷XXX類型kind。
switch reflect.ValueOf(Req.XXX).Kind() {//通過反射kind方法獲取XXX數據類型
case reflect.Slice, reflect.Array://切片或數組類型的處理
var SliceTemp = []struct {
AAA string `json:"aaa"`
BBB string `json:"bbb"`
CCC string `json:"ccc"`
}{}
if err := json.Unmarshal([]byte(Req),&SliceTemp );err != nil{
return
}
//range操作SliceTemp...
default://默認單結構體
var SingleTemp = struct {
AAA string `json:"aaa"`
BBB string `json:"bbb"`
CCC string `json:"ccc"`
}{}
if err := json.Unmarshal([]byte(Req),&SingleTemp );err != nil{
return
}
//操作SingleTemp...
}
