Go 函数指针作为带“quot”的参数;返回接口{}";
我想将一个函数指针传递给函数“anywhere” 打印从任何内容传入的内容都很容易(如中所示): 让我们假设,我想这样做: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
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