首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Golang利用反射设置结构体中的项, Json数据源

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

原创
作者头像
IT工作者
发布2022-07-20 10:14:52
发布2022-07-20 10:14:52
1.2K00
代码可运行
举报
文章被收录于专栏:程序技术知识程序技术知识
运行总次数:0
代码可运行

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

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

示例代码如下:

代码语言:javascript
代码运行次数:0
运行
复制
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的接口还不够熟练.

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档