インターフェイス パラメータに互換性のないエラーを持つ型 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 はインターフェースを受け入れる関数に渡すことができますが、{} とは互換性のある func(int) には拡張されません。 func(インターフェース{})を使用します。これは、Go のインターフェースが共変ではないためです。
解決策:
回避策として、匿名関数を通じてインターフェース{}を実装することで、インターフェース{}を期待する関数に関数を渡すことができます。 :
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 が を実装しているという事実を利用します。インターフェース{}。
プログラミング言語の分散についてさらに詳しく知りたい場合は、Wikipedia の記事と以下のリンクの投稿を検討してください:
以上がGo の型システムは、インターフェイス パラメーターを含む関数を渡すときに「互換性のないエラー」を生成するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。