结构体元素反射赋值

__Golang__ · 2021-03-10 17:04:40 · 1480 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2021-03-10 17:04:40 的主题,其中的信息可能已经有所发展或是发生改变。

目前赋值是先判断类型,然后赋值,简化如下

switch v.Field(i).Kind() {
case reflect.String:
    v.Field(i).SetString(value)
case reflect.Int:
    temp,_:=strconv.Atoi(value)
    v.Field(i).SetInt(int64(temp))
}

为啥不能直接这样

v.Field(i).Set(reflect.ValueOf(value))

Value提供Set方法的目的是什么?


有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1480 次点击  
加入收藏 微博
3 回复  |  直到 2021-03-10 18:03:55
jarlyyn
jarlyyn · #1 · 4年之前

看了下我的configloader的核心代码

func SetValue(dst, src reflect.Value) error {
    if !dst.CanSet() {
        return ErrNotSetable
    }
    if !src.Type().AssignableTo(dst.Type()) {
        return ErrNotAssignable
    }
    dst.Set(src)
    return nil
}

可以用啊,跑了好多个项目好久了

jarlyyn
jarlyyn · #2 · 4年之前

爬了我自己的代码,直接walkstruct然后 Set的,没用过SetString和SetInt方法

__Golang__
__Golang__ · #3 · 4年之前
jarlyynjarlyyn #1 回复

看了下我的configloader的核心代码 ```go func SetValue(dst, src reflect.Value) error { if !dst.CanSet() { return ErrNotSetable } if !src.Type().AssignableTo(dst.Type()) { return ErrNotAssignable } dst.Set(src) return nil } ``` 可以用啊,跑了好多个项目好久了

哦哦,我有个类型搞错了,感谢 ^-^

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传