Go 函数指针作为带“quot”的参数;返回接口{}";

Go 函数指针作为带“quot”的参数;返回接口{}";,go,function-pointers,Go,Function Pointers,我想将一个函数指针传递给函数“anywhere” 打印从任何内容传入的内容都很容易(如中所示): 让我们假设,我想这样做: 有多个结构 从各种函数加载数据 有一个为我调用函数的通用打印 我在一个剧本()中尝试了这一点,但出现了以下错误: ./prog.go:35:12:无法将getStuff1(type func()SomeObject)用作printStuff的参数中的类型FuncType ./prog.go:36:12:无法将getStuff2(type func()SomeOtherObj

我想将一个函数指针传递给函数“anywhere”

打印从任何内容传入的内容都很容易(如中所示):

让我们假设,我想这样做:

  • 有多个结构
  • 从各种函数加载数据
  • 有一个为我调用函数的通用打印
  • 我在一个剧本()中尝试了这一点,但出现了以下错误:

    ./prog.go:35:12:无法将getStuff1(type func()SomeObject)用作printStuff的参数中的类型FuncType

    ./prog.go:36:12:无法将getStuff2(type func()SomeOtherObject)用作printStuff的参数中的类型FuncType

    如果游戏内容被删除,下面是我试图找出如何开始工作的代码:

    package main
    
    import (
        "fmt"
    )
    
    type SomeObject struct {
        Value string
    }
    
    type SomeOtherObject struct {
            Value string
    }
    
    type FuncType func() interface{}
    
    func getStuff1() SomeObject {
        return SomeObject{
            Value: "Hello, world!",
        }
    }
    
    func getStuff2() SomeOtherObject {
        return SomeOtherObject{
            Value: "Another, hello!",
        }
    }
    
    func printStuff(toCall FuncType) {
        stuff := toCall()
        fmt.Printf("Testing : %v", stuff)
    }
    
    func main() {
        printStuff(getStuff1)
        printStuff(getStuff2)
    }
    
    什么是让这些东西正确传递的秘方

    更大的目标解释 因此,我在这里试图完成的是简化存在于一个巨大文件中的样板代码。不幸的是,由于其他限制,我现在无法进一步重构它,考虑到错误消息,我想知道这是否可能,而我读到的内容似乎说明了其他情况

    大量复制粘贴代码如下所示:

    func resendContraDevice(trap *TrapLapse, operation *TrapOperation) {
        loaded := contra.Load()
        err := trap.SnapBack(operation).send(loaded);
    
        // default error handling
        // logging
        // boilerplate post-process
    }
    
    func resendPolicyDevice(trap *TrapLapse, operation *TrapOperation) {
        loaded := policy.Load()
        err := trap.SnapBack(operation).send(loaded);
    
        // default error handling
        // logging
        // boilerplate post-process
    }
    
    // etc.
    
    在这些函数中,
    Load()

    我希望能得到一些我能得到的东西:

    loaded := fn()
    err := trap.SnapBack(operation).send(loaded);
    
    // default error handling
    // logging
    // boilerplate post-process
    
    send的签名是,它接受
    接口{}
    参数:

    func (s SnapBack) send(data interface{}) error
    

    例如,我不知道您是否可以控制
    contra.Load()
    policy.Load()
    的返回值,因此可能有更好的方法,但假设这些方法无法修改,这将允许您消除大量样板文件,而无需任何花哨的操作:

    func样板(tram*TrapLapse,operation*trapooperation,loader func()接口{}){
    已加载:=加载程序()
    错误:=trap.SnapBack(操作).send(已加载);
    //默认错误处理
    //伐木
    //样板后处理
    }
    func ResendContractDevice(陷阱*陷阱、操作*陷阱操作){
    样板文件(陷阱、操作、func()接口{}{return contra.Load()})
    }
    func ResendPolicy设备(陷阱*陷阱、操作*陷阱操作){
    样板文件(陷阱、操作、func()接口{}{return policy.Load()})
    }
    
    如果没有更复杂的内容,您还可以进一步简化:

    func样板(tram*TrapLapse、operation*trapooperation、加载的接口{}){
    错误:=trap.SnapBack(操作).send(已加载);
    //默认错误处理
    //伐木
    //样板后处理
    }
    func ResendContractDevice(陷阱*陷阱、操作*陷阱操作){
    样板(陷阱、操作、反向加载()
    }
    func ResendPolicy设备(陷阱*陷阱、操作*陷阱操作){
    样板文件(陷阱、操作、策略.Load())
    }
    
    你不能。唯一可以同时保存
    func()SomeObject
    func()SomeOtherObject
    的类型是
    interface{}
    。它们不能分配给
    func()接口{}
    ,因为这不是它们的函数签名。错误消息非常明确
    type func()SomeObject
    type func()接口{}
    是不同的,因此不可互换。要么更改函数以返回
    interface{}
    ,要么找到另一个解决方案(另一个解决方案可能是最好的,因为
    interface{}
    ),这听起来很像XY问题。你能解释一下你更大的目标吗?你也不能这样称呼他们,所以他们是毫无用处的。我会从头开始重新考虑这种方法,以避免传递不同类型函数的整个想法。@Flimzy我试图进行一些简化调用,以尝试减少行为类似于此但在更大范围内的样板代码。我将编辑这个问题并添加一些更大的范围。这太完美了。我知道你在那里做了什么-使用内联函数按它想要的方式“强制转换/重新发送”。不幸的是,我无法控制这些返回值,因为这个特定项目的首席架构师在进行更大的重构时犹豫不决。仅供参考-我还假设我需要一个为此定义的类型,但是能够使用
    func()接口{}
    更符合我的需要。所以我现在也学到了一些其他的东西。即使这样也可能太复杂了。我已经提供了一个进一步的简化,我怀疑它也会起作用。我明白了。这将适用于此,但我还有另一个地方需要说明返回的错误,以及更复杂的配置有意义的地方。更小的版本是我不打算做的,但它看起来确实是更好的选择。
    func (s SnapBack) send(data interface{}) error