duanhuokuang5280 2017-11-25 18:14 采纳率: 100%
浏览 34
已采纳

将界面转换为另一个并复制内容

I've got the following method:

func ValidateParam(conf map[string]interface{}, paramName string, out interface{}) error {
    param, ok := conf[paramName]

    if !ok {
        return errors.New("some error")
    }

    // ...
}

I would like to be able to call it like so:

myVar := "some text"
err := ValidateParam(conf, "my_var_param", &myVar)

myOtherVar := &MyStruct{}
err := ValidateParam(conf, "my_struct_param", myOtherVar)

The idea is:

  • Get the param using the conf map
  • Check that this param could be converted into the same type as out
  • Hydrate out using the param

=> It is kind of the same process as for json.Unmarshal(data, &myVar) or when doing a query with mgo query.Collection("col").One(&myVar)

I can't find how to achieve this, any help would be more than welcome.

Cheers

  • 写回答

1条回答 默认 最新

  • doulaozhi6835 2017-11-25 18:28
    关注

    One option is to use the reflect package:

    The basic idea is to create reflect.Values for input and output, check if input is assignable to output and then assign.

    func ValidateParam(conf map[string]interface{}, paramName string, out interface{}) error {
        param, ok := conf[paramName]
    
        if !ok {
            return errors.New("some error")
        }
    
        // Output is pointer to value.
        vo := reflect.ValueOf(out)
        if vo.Kind() != reflect.Ptr {
            return errors.New("out must be poitner")
        }
        vo = vo.Elem()  // deref ptr
    
        // Can input be assigned to output?
        vi := reflect.ValueOf(param)
        if !vi.Type().AssignableTo(vo.Type()) {
            return fmt.Errorf("param %s of type %v is not assignable to %v", paramName, vi.Type(), vo.Type())
        }
    
        vo.Set(vi)
        return nil
    }
    

    playground example

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

报告相同问题?

悬赏问题

  • ¥15 公交车和无人机协同运输
  • ¥15 stm32代码移植没反应
  • ¥15 matlab基于pde算法图像修复,为什么只能对示例图像有效
  • ¥100 连续两帧图像高速减法
  • ¥15 组策略中的计算机配置策略无法下发
  • ¥15 如何绘制动力学系统的相图
  • ¥15 对接wps接口实现获取元数据
  • ¥20 给自己本科IT专业毕业的妹m找个实习工作
  • ¥15 用友U8:向一个无法连接的网络尝试了一个套接字操作,如何解决?
  • ¥30 我的代码按理说完成了模型的搭建、训练、验证测试等工作(标签-网络|关键词-变化检测)