介面參數不相容的類型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中文網其他相關文章!