加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

golang map to struct

发布时间:2020-12-16 18:38:53 所属栏目:大数据 来源:网络整理
导读:map映射到结构体,这里只支持简单的数据类型,复杂的需要在拓展 package mainimport ("errors""fmt""reflect""strconv""time")type User struct {Name stringAge int8Date time.Time}func main() {data := make(map[string]interface{})data["Name"] = "张三

map映射到结构体,这里只支持简单的数据类型,复杂的需要在拓展

package main

import (
	"errors"
	"fmt"
	"reflect"
	"strconv"
	"time"
)

type User struct {
	Name string
	Age  int8
	Date time.Time
}

func main() {

	data := make(map[string]interface{})
	data["Name"] = "张三"
	data["Age"] = 26
	data["Date"] = "2015-09-29 00:00:00"

	result := &User{}
	err := FillStruct(data,result)
	fmt.Println(err,fmt.Sprintf("%+v",*result))
}

//用map填充结构
func FillStruct(data map[string]interface{},obj interface{}) error {
	for k,v := range data {
		err := SetField(obj,k,v)
		if err != nil {
			return err
		}
	}
	return nil
}

//用map的值替换结构的值
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)              //map值的反射值

	var err error
	if structFieldType != val.Type() {
		val,err = TypeConversion(fmt.Sprintf("%v",value),structFieldValue.Type().Name()) //类型转换
		if err != nil {
			return err
		}
	}

	structFieldValue.Set(val)
	return nil
}

//类型转换
func TypeConversion(value string,ntype string) (reflect.Value,error) {
	if ntype == "string" {
		return reflect.ValueOf(value),nil
	} else if ntype == "time.Time" {
		t,err := time.ParseInLocation("2006-01-02 15:04:05",value,time.Local)
		return reflect.ValueOf(t),err
	} else if ntype == "Time" {
		t,err
	} else if ntype == "int" {
		i,err := strconv.Atoi(value)
		return reflect.ValueOf(i),err
	} else if ntype == "int8" {
		i,err := strconv.ParseInt(value,10,64)
		return reflect.ValueOf(int8(i)),err
	} else if ntype == "int32" {
		i,64)
		return reflect.ValueOf(int64(i)),err
	} else if ntype == "int64" {
		i,64)
		return reflect.ValueOf(i),err
	} else if ntype == "float32" {
		i,err := strconv.ParseFloat(value,64)
		return reflect.ValueOf(float32(i)),err
	} else if ntype == "float64" {
		i,err
	}

	//else if .......增加其他一些类型的转换

	return reflect.ValueOf(value),errors.New("未知的类型:" + ntype)
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读