「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Go ジェネリックスのユニオン制約は、明示的なインターフェイス宣言なしで共有メソッドを呼び出すことができますか?

Go ジェネリックスのユニオン制約は、明示的なインターフェイス宣言なしで共有メソッドを呼び出すことができますか?

2024 年 12 月 23 日に公開
ブラウズ:999

Can Go Generics' Union Constraints Call Shared Methods Without Explicit Interface Declaration?

Go ジェネリックでの共用体制約のメソッドの呼び出し

Go ジェネリック (v1.18) では、制限を制限する型共用体制約が発生する可能性があります。パラメータの型を、統一インターフェイスを実装する型に変更します。ただし、制約された型間で共有メソッドを呼び出すことができないため、そのような制約の有用性について懸念が生じます。

次のコードを検討してください:

type A struct {}
type B struct {}
type AB interface { *A | *B }

func (a *A) some() bool { return true }
func (b *B) some() bool { return false }

func some[T AB](x T) bool { return x.some() } // Compiler error

コンパイラ エラー「x.some 未定義」は、型共用体制約 *A が原因です。 | *B は、*A と *B の両方にメソッドが存在することを保証しません。

この問題を解決するには、インターフェイス制約にメソッドを追加します。

type AB interface { *A | *B; some() bool }

func some[T AB](x T) bool { return x.some() } // Works

これにより、T は *A または *B の両方を実装し、some メソッドを宣言する型に制限されます。

ただし、この解決策は、型共用体だけで理想的に機能するものに対する回避策と見なされます。 Go 1.18 には現在、メソッド m が P の制約インターフェイスによって明示的に宣言されている場合にのみ、コンパイラが型パラメーター P の値に対するメソッドの呼び出しをサポートするという制限があります。言語仕様では、インターフェイスのメソッド セットは、インターフェイスの型セット内の各型のメソッド セットの共通部分であると述べられています。この問題は Go 1.19 で解決される予定です。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3