ホームページ > バックエンド開発 > Golang > Go 1.18 でジェネリックを使用して特定のタイプの新しいオブジェクトを作成するには?

Go 1.18 でジェネリックを使用して特定のタイプの新しいオブジェクトを作成するには?

Patricia Arquette
リリース: 2024-12-12 17:03:09
オリジナル
302 人が閲覧しました

How to Create New Objects of a Specific Type Using Generics in Go 1.18?

Go 1.18 のジェネリックスを使用した新しいオブジェクトの作成

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート