類型func 出現介面參數不相容錯誤
問題:
呼叫作為參數傳遞的函數時對於採用符合interface{} 的值的類型func,會遇到錯誤。例如,在以下程式碼中:
type myfunc func(x interface{}) func a(num int) { } func b(f myfunc) { f(2) } func main() { b(a) // error: cannot use a (type func(int)) as type myfunc in argument to b }
解釋:
此錯誤源自於 Go 的型別系統缺乏對其差異的支持。變異數是指在參數參數中使用子類型和超類型的靈活性。與其他類型系統不同,Go 的介面不支援方差。
在給定的範例中,雖然 int 可以傳遞給接受 interface{} 的函數,但這並不能擴展到相容 func(int)與 func(interface{}) 一起使用。這是因為 Go 中的介面不是協變的。
解決方案:
作為一種解決方法,可以透過匿名函數實作interface{} 來將函數傳遞給需要interface{} 的函數:
package main import "fmt" func foo(x interface{}) { fmt.Println("foo", x) } func add2(n int) int { return n + 2 } func main() { foo(func(n int) int { return n + 2 }) }
這種方法利用了func(int)int 確實實作的事實介面{}。
要進一步了解程式語言的方差,請考慮瀏覽維基百科文章和下面鏈接的帖子:
以上是為什麼 Go 的型別系統在傳遞帶有介面參數的函數時會產生「不相容錯誤」?的詳細內容。更多資訊請關注PHP中文網其他相關文章!