Golang利用反射设置结构体中的项, Json数据源

项目中涉及到动态修改配置的需求, 动态设置的数据项有多种类型, 基础类型 int/string都有reflect的原生支持, 如果遇到其他类型的时候如何处理?

我这里想到的是: 其他类型统一使用json反序列,然后利用反射设置.

示例代码如下:

package main

import "fmt"
import "encoding/json"
import "reflect"


type Settings struct {
	A int
	B [][]int
}

func main() {

    // 准备模拟json数据
	var arr [][]int
	arr = append(arr, []int{1, 2})
	s, _ := json.Marshal(&arr)

	// 模拟动态设置B项
	var t Settings
	key := "B"

	tt := reflect.ValueOf(&t)
	tv := tt.Elem().FieldByName(key)

	fmt.Println("type:", tv.Type().String())

	newObj := reflect.New(tv.Type())
	err := json.Unmarshal(s, newObj.Interface())
	if err != nil {
		fmt.Println(err.Error())
	}

	tv.Set(newObj.Elem())
	fmt.Println(t)
}

这里主要是倒数第二行, 将JSON反序列化得到的数据newObj 设置到tv时, 遇到了一点麻烦,

*[][]int 和 [][]int之间的问题. 后来才想到使用Elem(), 问题得到解决. 同理,应该可以动态设置其他自定义类型. 主要还是对reflect的接口还不够熟练.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值