首頁 >後端開發 >Golang >為什麼 Go 將特定參數類型的函數傳遞給接受 Interface{} 參數的函數時會報告錯誤?

為什麼 Go 將特定參數類型的函數傳遞給接受 Interface{} 參數的函數時會報告錯誤?

DDD
DDD原創
2024-12-25 13:03:10429瀏覽

Why Does Go Report an Error When Passing a Function with a Specific Parameter Type to a Function Accepting an Interface{} Parameter?

介面參數不相容的類型Func

當定義接受任何符合介面的值的函數型別時,可能會遇到令人困惑的情況呼叫似乎與該規範相符的函數時出錯。

考慮以下內容例如:

type myfunc func(x interface{})

func a(num int) {
    return
}

func b(f myfunc) {
    f(2)
    return
}

func main() {
    b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b
    return
}

出現錯誤是因為Go 中的介面表現出不變性,這表示雖然int 可以傳遞給需要介面{ }的函數,但對於func(int) 和func(interface{})。

在 Go 中,類型相容的函數必須具有相同的參數和傳回類型。由於 func(int) 和 func(interface{}) 不符合此要求,Go 認為它們不相容。

要解決此問題,請考慮使用以下方法:

package main

import "fmt"

func foo(x interface{}) {
    fmt.Println("foo", x)
}

func add2(n int) int {
    return n + 2
}

func main() {
    foo(add2)
}

在此範例中,func(int)int 傳遞給需要 interface{} 的函數。這是允許的,因為 func(int)int 實作了 interface{},這要求它具有指定輸入和傳回類型的單一方法。

有關 Go 中變異數的更詳細說明,請參閱 Wikipedia 文章主題和所提供答案中連結的部落格文章。

以上是為什麼 Go 將特定參數類型的函數傳遞給接受 Interface{} 參數的函數時會報告錯誤?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn