duanlan3598 2018-10-28 03:53
浏览 557
已采纳

动态修改Golang struct {}值上的属性,另外

I have this code in a router handler

    decoder := json.NewDecoder(r.Body)
    var t person.Model
    err := decoder.Decode(&t).          // t is a struct value
    item, ok := v.People[params["id"]]. // ok is a struct value

    if t.Handle != "" {
        item.Handle = t.Handle
    }

    if t.Work != "" {
        item.Work = t.Work
    }

    if t.Image != "" {
        item.Image = t.Image
    }

    if t.Firstname != "" {
        item.Firstname = t.Firstname
    }

    if t.Lastname != "" {
        item.Lastname = t.Lastname
    }

    if t.Email != "" {
        item.Email = t.Email
    }

But I would like to make this dynamic, something like this:

["Handle", "Work", "Image", "Firstname", "Lastname", "Email"].forEach(v => {
    if t[v] != "" {
        item[v] = t[v]
    }
});

is this possible with Golang somehow?

  • 写回答

1条回答 默认 最新

  • dpxbc88022 2018-10-28 05:59
    关注

    Use the reflect package for this:

    func setFields(dst, src interface{}, names ...string) {
        d := reflect.ValueOf(dst).Elem()
        s := reflect.ValueOf(src).Elem()
        for _, name := range names {
            df := d.FieldByName(name)
            sf := s.FieldByName(name)
            switch sf.Kind() {
            case reflect.String:
                if v := sf.String(); v != "" {
                    df.SetString(v)
                }
                // handle other kinds
            }
        }
    }
    

    Call it with pointers to the values:

    setFields(&item, &t, "FirstName", "LastName", "Email", "Handle")
    

    Playground example

    If your actual goal is to overwrite only the fields present in the JSON, then do just that:

    item, ok := v.People[params["id"]]. 
    decoder := json.NewDecoder(r.Body)
    err := decoder.Decode(&item)
    

    Playground example

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 关于#网络安全#的问题:求ensp的网络安全,不要步骤要完成版文件
  • ¥15 可否在不同线程中调用封装数据库操作的类
  • ¥20 使用Photon PUN2解决游戏得分同步的问题
  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序