Go 关键字,例如 go 和 defer Expect 函数调用作为参数。是否有一种专用类型可以达到相同的目的,允许函数接收函数调用作为参数而不是函数?
不幸的是,没有这样的类型去。 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: myFunc in this example }</code>
在某些情况下,需要为函数调用自动保存参数。对于特定的函数类型,这可以通过引入具有相同签名的返回无参数函数的辅助函数来实现。这些闭包使用保存的参数调用原始函数。
反射可用于避免手动参数复制。但是,它涉及传递函数而不是调用它,从而减慢了进程。
使用方法时出现异常。方法值可以保存接收者的副本,从而允许自动保存方法调用的参数。
<code class="go">type myParams struct { format string i int s string } func (mp myParams) Call() { fmt.Printf(mp.format, mp.i, mp.s) } func main() { p := myParams{format: "%d %q\n", i: 1, s: "Hello, playground"} launch(p.Call) // p is saved here p.i, p.s = 2, "changed" time.Sleep(time.Second) }</code>
注意:这些方法都没有提供与所需功能的精确匹配。如果参数可能发生变化,则在将函数传递给保存参数的助手之前,需要手动复制。
以上是你能在 Go 中定义函数调用的类型吗?的详细内容。更多信息请关注PHP中文网其他相关文章!