gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 02:32:06 25 4
gpt4 key购买 nike

我有以下方法:

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

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

// ...
}

我希望能够这样调用它:

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

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

思路是:

  • 使用conf 映射获取参数
  • 检查此参数是否可以转换为与 out 相同的类型
  • Hydrate out 使用参数

=> 它与 json.Unmarshal(data, &myVar) 或使用 mgo query.Collection("col").One( &myVar)

我找不到如何实现这一点,我们非常欢迎任何帮助。

干杯

最佳答案

一种选择是使用反射包:

基本思想是为输入和输出创建 reflect.Values,检查输入是否可分配给输出然后分配。

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

关于go - 将界面转换为另一个界面并复制内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47489126/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com