Golang语言笔记

返回个人知识库入口

编号分类文章及链接备注1来源分类收录日期
Env1环境Golang在Ubuntu 和 Windows下的安装Ubuntu和Windows下安装Golang SDK本博客2018-10-23
Env2环境Linux安装GO语言环境CentOS下安装Golang SDK本博客2019-05-21
Env3环境Pycharm PHPStorm WebStorm Goland Clion Idea全家桶 激活教程可用2020-07-20
Lang0基础Go语言简介go语言系统讲解C语言中文网2020-07-30
Lang1语法Golang的单引号、双引号与反引号用法字符串常量初始化注意事项本博客2020-02-22
Lang2语法golang面向对象思想和实现快乐编程2020-02-23
Lang3技巧Golang中的字符串处理总结CSDN博客2020-02-23
Lang4技巧Golang标准库深入 - 双向链表(container/list)好文!用插图方式清晰简要讲述了双向链表的用法开源中国2020-07-26
Lang5技巧GoLang基础数据类型—>字典(map)详解好文!详述map的各种用法博客园2020-07-26
Lang6技巧golang 数据类型之间的转换讲解清晰明了CSDN博客2020-07-27
Lang7技巧golang创建文件目录os.Mkdir、os.MkdirAll区别CSDN博客2020-07-27
Lang8容错处理golang里捕获进程信号实现优雅退出的方法php中文网2020-08-09
Lang9容错处理golang如何捕获错误吾八哥博客2020-08-06
Tools1工具Go内嵌静态资源go-bindata的安装及使用本博客2018-11-07
Tools2grpcGo使用grpc+http打造高性能微服务图文并茂CSDN博客2020-07-20
Tools3grpc使用grpc开发RPC服务(一)原版思否2020-07-20
Tools4grpcWindows下grpc安装简书2020-07-20
Tools5grpcWindows下安装grpc开发环境本博客2020-07-21
Tools6技巧在Windows中编译Linux运行的Golang程序博客园2020-07-28
Tools7技巧超好用的免费Redis客户端CSDN博客2020-07-27

笔记

结构体转换为Map类型
func (o *Order) ToMap() map[string]interface{} {
	var data = make(map[string]interface{})
	objType := reflect.TypeOf(*o)
	objValue := reflect.ValueOf(*o)
	for i := 0; i < objValue.NumField(); i++ {
		data[objType.Field(i).Name] = objValue.Field(i).Interface()
	}
	//log.Debug("order to map:%v",data)
	return data
}

func (o *Order) FromMap(data map[string]interface{}) {
	// 通用做法只能针对基本数据类型
	for k, v := range data {
		err := SetField(o, k, v)
		if err != 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 := time.ParseInLocation("2006-01-02 15:04:05", value, time.Local)
		return reflect.ValueOf(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, err := strconv.ParseInt(value, 10, 64)
		return reflect.ValueOf(int64(i)), err
	} else if ntype == "int64" {
		i, err := strconv.ParseInt(value, 10, 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 := strconv.ParseFloat(value, 64)
		return reflect.ValueOf(i), err
	} else if ntype == "enum.OrderAction" {
		//value.Valid()
	}

	return reflect.ValueOf(value), errors.New("未知的类型:" + ntype)
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值