首頁  >  文章  >  後端開發  >  你能在 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