Go 1.18 ベータ版のジェネリックスは、柔軟で再利用可能なコードを作成する強力な方法を提供します。一般的なタスクの 1 つは、特定のタイプの新しいオブジェクトを作成することです。ただし、この機能を実装するには、ジェネリック構文をある程度理解する必要があります。
以下のコードは、ジェネリック型パラメータ T を使用して FruitFactory を定義します。Create メソッドは、ジェネリック型パラメータ T を使用して FruitFactory を定義します。 T の新しいインスタンス (例: *Apple) ですが、現在は nil を返すため、オブジェクトのアクセス時にプログラムがクラッシュします。 properties.
type FruitFactory[T any] struct{} func (f FruitFactory[T]) Create() *T { // How to create a non-nil fruit here? return nil } type Apple struct { color string } func example() { appleFactory := FruitFactory[Apple]{} apple := appleFactory.Create() // Panics because nil pointer access apple.color = "red" }
Apple は非ポインター型であるため、単純に型 T の変数を宣言してそのアドレスを返すことができます。
func (f FruitFactory[T]) Create() *T { var a T return &a }
あるいは、new(T) を使用して新しいインスタンスを作成し、そのインスタンスを返すこともできます。 pointer:
func (f FruitFactory[T]) Create() *T { return new(T) }
これらの変更により、Create メソッドは型 T の有効なオブジェクトを返すようになり、nil ポインターの問題が解決されました。
If FruitFactoryポインター型でインスタンス化される場合、セグメンテーション違反を回避するには、より複雑なソリューションが必要です。型パラメーターでポインター型を制約するには、カスタム インターフェイス Ptr が必要です。
// Constraining a type to its pointer type type Ptr[T any] interface { *T } // The first type parameter will match pointer types and infer U type FruitFactory[T Ptr[U], U any] struct{} func (f FruitFactory[T,U]) Create() T { // Declare var of non-pointer type. This is not nil! var a U // Address it and convert to pointer type (still not nil) return T(&a) }
この設定により、ジェネリック ファクトリ内でポインター型の新しいインスタンスを作成できるようになり、セグメンテーション フォールトを防ぐことができます。
以上がGo 1.18 でジェネリックを使用して特定のタイプの新しいオブジェクトを作成するには?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。