首页  >  文章  >  后端开发  >  你能在 Go 中定义函数调用的类型吗?

你能在 Go 中定义函数调用的类型吗?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-01 11:49:02526浏览

Can You Define a Type for Function Calls in Go?

Go 中是否可以为函数调用定义类型?

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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn