問題と目標
ジェネリックスでは、 Go 1.18 の一部であるため、多くの開発者は、複雑なデータを正確に表現する型を作成することに目標を定めています。概念。典型的なケースは「Either[A, B]」タイプで、値が 2 つの異なるタイプ A または B のいずれかである可能性を表します。
インターフェイス定義ハードル
「Either」型のインターフェイスを定義する場合、インターフェイス メソッドで型パラメーターを許可しないという言語の制限により、障害が発生します。この制限により、値のバリアントに基づいて異なる型を返す 'Switch' メソッドを表現できなくなります。
クリエイティブな実装
この問題を克服するには、次のような方法があります。関数型プログラミング言語からインスピレーションを得て、特定の値または不在を表す機能をカプセル化する「Optional」型を実装します。これに基づいて、「Either」タイプを定義できます。
type Either[A, B any] interface { is_left() bool is_right() bool find_left() Optional[A] find_right() Optional[B] }
このアプローチでは、「Switch」メソッドに依存する代わりに、「is_left」メソッドと「is_right」メソッドを活用して、含まれる価値。 'find_left' メソッドと 'find_right' メソッドは、対応する型の 'Optional' 値を提供します。
実装の詳細と使用法
'Left' と ' 内「Either」を実装する Right の具象型では、実際のペイロードを管理し、必要なブール値フラグを提供します。 「left」関数と「right」関数はコンストラクターとして機能し、インスタンス化を簡素化します。
使用例は、「Either」型の操作方法を示しています。
func main() { var e1 Either[int, string] = left[int, string](4143) var e2 Either[int, string] = right[int, string]("G4143") if e1.is_left() { if l, err := e1.find_left().get(); err == nil { fmt.Printf("The int is: %d\n", l) } else { fmt.Fprintln(os.Stderr, err) } } }
結論
Go の一般的な制限により課題が生じますが、それらを回避して強力な機能を作成することは可能です。 「Either」タイプのような抽象化。 「オプション」を活用し、ヘルパー メソッドを備えたカスタム インターフェイスを実装することで、開発者は Go コードに求める柔軟性と表現力を得ることができます。
以上がインターフェイス メソッドのジェネリックスの制限を考慮して、Go でいずれかの型を実装するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。