Go ジェネリックを使用した型付きオブジェクトの作成
Go 1.18 では、ジェネリックは型を動的に操作する強力な方法を提供します。一般的なタスクの 1 つは、指定されたタイプの新しいオブジェクトを作成することです。次の例を考えてみましょう。
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" }
FruitFactory はジェネリック型 T の新しいインスタンスを作成しようとします。ただし、nil を返すとプログラムがクラッシュします。このシナリオで新しいオブジェクトを作成する方法を見てみましょう。
非ポインター オブジェクトの作成
型 T がポインター型ではない場合は、変数とそのアドレスを返します:
func (f FruitFactory[T]) Create() *T { var a T return &a }
または、次のようにすることもできますnew(T):
func (f FruitFactory[T]) Create() *T { return new(T) }
ポインター オブジェクトの作成
ポインター オブジェクトの作成にはさらに多くの作業が必要です。型推論を使用して、非ポインター変数を宣言し、それをポインターに変換できます:
// Constraining a type to its pointer type type Ptr[T any] interface { *T } // The first type param 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) } type Apple struct { color string } func main() { // Instantiating with pointer type appleFactory := FruitFactory[*Apple, Apple]{} apple := appleFactory.Create() // All good apple.color = "red" fmt.Println(apple) // &{red} }
以上がGo でジェネリックを使用してジェネリック型の型付きオブジェクトを安全に作成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。