golang interface to struct

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

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值