项目中涉及到动态修改配置的需求, 动态设置的数据项有多种类型, 基础类型 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的接口还不够熟练.