在 Go 中实现类似函数调用的行为
在 Go 中,像 go 和 defer 这样的关键字期望函数作为参数传递。但是,有一个限制阻止传递实际的函数调用。
答案:
不幸的是,没有直接类型可以让您模拟函数调用作为参数。 go 和 defer 是语言规范支持的语法结构,编译器会强制执行此行为。
替代方法:使用函数值
要绕过此限制,您可以使用函数值。函数值是函数类型的变量或值。您可以稍后或在需要时随时调用函数值。
<code class="go">func myFunc() { fmt.Println("hi") } func main() { var f func() f = myFunc f() // This calls the function value stored in f, which is myFunc in this case }</code>
模拟自动参数保存
在评论中,您提到了自动参数保存的愿望。以下是如何使用辅助函数来实现此目的,该函数提供带有保存参数的包装函数:
<code class="go">func wrapPrintln(s string) func() { return func() { fmt.Println(s) } } func launch(f func()) { fmt.Println("Before launch") go func() { defer fmt.Println("After completion") f() }() } func main() { s := "Hello, playground" launch(wrapPrintln(s)) }</code>
反射作为选项
反射是另一种处理方法这种情况,但它涉及将函数作为接口传递并使用反射来调用它。这种方法比使用函数值效率低,但允许处理具有不同签名的函数。
总之,虽然没有直接的方法将函数调用作为参数传递,但可以使用函数值或通过帮助器模仿参数保存函数提供了实现类似行为的解决方法。
以上是你能在 Go 中将函数调用作为参数传递吗?的详细内容。更多信息请关注PHP中文网其他相关文章!