ホームページ >バックエンド開発 >Golang >なぜ Can't Go のインターフェイス メソッドに型パラメータがあるのでしょうか?

なぜ Can't Go のインターフェイス メソッドに型パラメータがあるのでしょうか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-30 16:21:11747ブラウズ

Why Can't Go's Interface Methods Have Type Parameters?

Go のジェネリックス: インターフェイス メソッドのパラメーターの制限

Go 1.18beta2 では、ジェネリック パラメーターを使用してインターフェイス メソッドを定義するときに、次のような問題が発生する可能性があります。 「インターフェイス メソッドには型パラメーターが必要ありません。」というエラーが表示されます。この記事では、この制限に光を当て、考えられる解決策を検討します。

インターフェイス メソッドで型パラメータが許可されないのはなぜですか?

この制限の理由は設計に根ざしています。ジェネリックスと型パラメーターに関する考慮事項。インターフェイスはメソッドのシグネチャと動作のセットのコントラクトを定義しますが、ジェネリック メソッドは型を抽象化するメカニズムを提供します。インターフェイス メソッドで型パラメーターを許可すると、以下の点で複雑さが生じます。

  • メソッド引数の同一性の保持
  • コンパイル時にメソッド実行ツリーを横断し、パフォーマンスに影響を与える可能性があります
  • 必須実行時リフレクションにより、パフォーマンスがさらに損なわれる
  • パラメータ化されたメソッドの実装を許可することで混乱が生じるインターフェイス

制限の克服

インターフェイス メソッドで型パラメータを直接使用することはできませんが、代替ソリューションがあります。

型パラメータをインターフェイス定義に移動します:

を宣言する代わりに、インターフェイス メソッド内の type パラメータをインターフェイス定義自体に移動します。これにより、インターフェイスは特定の型パラメータに基づいて特殊化できます。

type Reader[V Unmarshaler] interface {
    Read(bucket []byte, k ...[]byte) ([][]byte, error)
    ReadDoc(bucket []byte, factory func() (V, error), k ...[]byte) ([]V, error)
}

結論

インターフェイス メソッドの型パラメータの制限は、確実に行うための意図的な設計上の決定です。 Go ジェネリックスのインターフェイスの明確さ、パフォーマンス、一貫した実装。最初は問題が生じるかもしれませんが、上記で提供した代替ソリューションは、この制限を回避し、コード内でジェネリックの力を活用する実用的な方法を提供します。

以上がなぜ Can't Go のインターフェイス メソッドに型パラメータがあるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。