package main
import (
"errors"
"fmt"
"reflect"
)
// func SetField(obj interface{}, name string, value interface{}) error {
// structValue := reflect.ValueOf(obj).Elem()
// structFieldValue := structValue.FieldByName(name)
// if !structFieldValue.IsValid() {
// return fmt.Errorf("No such field: %s in obj", name)
// }
// if !structFieldValue.CanSet() {
// return fmt.Errorf("Cannot set %s field value", name)
// }
// structFieldType := structFieldValue.Type()
// val := reflect.ValueOf(value)
// if structFieldType != val.Type() {
// return errors.New("Provided value type didn't match obj field type")
// }
// structFieldValue.Set(val)
// return nil
// }
// type MyStruct struct {
// Name string
// Age int64
// }
// func (s *MyStruct) FillStruct(m map[string]interface{}) error {
// for k, v := range m {
// err := SetField(s, k, v)
// if err != nil {
// return err
// }
// }
// return nil
// }
// func main() {
// myData := make(map[string]interface{})
// myData["Name"] = "Tony"
// myData["Age"] = int64(23)
// result := &MyStruct{}
// err := result.FillStruct(myData)
// if err != nil {
// fmt.Println(err)
// }
// fmt.Println(result)
// }
// PSDeviceRecord ...
type PSDeviceRecord struct {
CameraID string `json:"cameraId" gorm:"column:device_id"`
Timestamp int64 `json:"timestamp" gorm:"column:captured_at"`
FaceImageURI string `json:"faceImageUri" gorm:"column:captured_face_image_uri"`
PictureURI string `json:"pictureUri" gorm:"column:captured_image_uri"`
}
func convert(i interface{}) []*PSDeviceRecord {
result := []*PSDeviceRecord{}
switch reflect.TypeOf(i).Kind() {
case reflect.Slice:
s := reflect.ValueOf(i)
ps := &PSDeviceRecord{}
for i := 0; i < s.Len(); i++ {
ss := s.Index(i)
temp, ok := ss.Interface().(map[string]interface{})
if !ok {
fmt.Println("数据接卸错误")
}
for k, v := range temp {
setField(ps, k, v)
}
}
result = append(result, ps)
}
return result
}
func setField(obj interface{}, name string, value interface{}) error {
structValue := reflect.ValueOf(obj).Elem()
structFieldValue := reflect.Value{}
v := reflect.TypeOf(obj)
if v.Kind() == reflect.Ptr {
v = v.Elem()
}
for i := 0; i < v.NumField(); i++ {
tag := v.Field(i).Tag.Get("json")
if tag != "" && tag != "-" {
if tag == name {
structFieldValue = structValue.FieldByIndex([]int{i})
}
}
}
if !structFieldValue.IsValid() {
return fmt.Errorf("No such field: %s in obj", name)
}
if !structFieldValue.CanSet() {
return fmt.Errorf("Cannot set %s field value", name)
}
structFieldType := structFieldValue.Type()
val := reflect.ValueOf(value)
if structFieldType != val.Type() {
return errors.New("Provided value type didn't match obj field type")
}
structFieldValue.Set(val)
return nil
}
func main() {
m := make([]map[string]interface{}, 2)
m = append(m, map[string]interface{}{"cameraId": "1", "faceImageUri": "1349605922988625920", "pictureUri": "1349605922988625920", "timestamp": "1.610606095e+09"},
map[string]interface{}{"cameraId": "1", "faceImageUri": "1349605922988625921", "pictureUri": "1349605922988625921", "timestamp": "1.610606095e+10"})
ps := convert(m)
for _, p := range ps {
fmt.Printf("p:%+v", p)
}
}