golang 怎么实现 func 返回动态类型

问题描述

我希望 func A 传参一个 func B ,调用 func A 返回 func B 返回的结果

例如下面截图的代码 Get 方法(左边) 调用 Read 方法(右边), 但 Read 方法返回的值我需要再做一次转换 返回 []*NamespaceOption, 所以我在 Read 方法的返回参数加上 []*interface{} , 但 golang 很明显不允许这么做

那有什么替代方案实现这种效果 ?

相关代码

微信图片_20191018111019.png

// 调用方
func (n *Namespace) Get(appId string) ([]*NamespaceOption, error){
    deploy := &Deployment{
        Trace:&Trace{Namespace:appId},
    }
    return deploy.Read(func(values []*mvccpb.KeyValue) []*NamespaceOption {
        var ops []*NamespaceOption
        for _, val := range values {
            op := &NamespaceOption{}
            if util.Decode(val.Value, op) == nil {
                ops = append(ops, op)
            }
        }
        return ops
    })
}

// 被调用方
func (d *Deployment) Read(f func([]*mvccpb.KeyValue) []*interface{}) ([]*interface{}, error) {
    ...
    return f(values), nil
}
阅读 5.4k
3 个回答

你传进Read的方法都已经完成到[]*NamespaceOption的转换了,为什么Read还要返回[]*interface{}呢,把[]*interface{}返回值改成[]*NamespaceOption不就行了?

其实去掉 deploy.Read 的返回参数就行了,调用方式如下

var ops []*NamespaceOption
deploy.Read(func(values []*mvccpb.KeyValue) {
    ...
    ops = append(ops, op)
})

println(ops)

但我想将调用方式改成:

ops := deploy.Read(func(values []*mvccpb.KeyValue) {
    var ops []*NamespaceOption
    ...
    ops = append(ops, op)
    return ops
})

println(ops)

让funcA的返回值类型和funcB的一样就好啊

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题