Go 1.18 でジェネリックスを利用して型付きの値を作成する方法
Go プログラミングでは、ジェネリックスを使用してさまざまな型で動作するコードを作成できます。明示的なキャストや型アサーションは必要ありません。この記事では、Go 1.18 でジェネリックを利用して型付き値の新しいオブジェクトを作成する方法について説明します。
背景: フルーツ ファクトリーの例
次の簡略化された "フルーツ ファクトリー" の例を考えてみましょう。これは、フルーツの新しいインスタンスを一般的に作成しようとします:
type FruitFactory[T any] struct{} func (f FruitFactory[T]) Create() *T { // How do we create a non-nil fruit here? // Returning nil crashes the example. return nil } type Apple struct { color string }
この例では、タスクは、Create 関数を完了して、タイプ T (つまり、Apple タイプの場合は *Apple) の新しいインスタンスを作成することです。ただし、単に nil を返すだけでは不十分で、オブジェクトのプロパティにアクセスするときにプログラムがクラッシュします。
解決策: 型付きオブジェクトの作成
オブジェクトを作成するには、主に 2 つの方法があります。 Go でジェネリックスを使用した型付き値の新しいインスタンス1.18:
func (f FruitFactory[T]) Create() *T { var a T return &a }
func (f FruitFactory[T]) Create() *T { return new(T) }
これらのソリューションにより、関数は非ポインター値 (a または new(T)) を作成し、必要に応じてそのアドレス ( &a).
実装例
「フルーツファクトリー」内例:
func (f FruitFactory[T]) Create() *T { var a T return &a } func example() { appleFactory := FruitFactory[Apple]{} apple := appleFactory.Create() apple.color = "red" // No panic now }
この変更により、セグメンテーション違反が発生することなく、新しい Apple オブジェクトを作成し、そのプロパティを設定できるようになります。
結論
Go 1.18 のジェネリックスを使用すると、型付き値を使用したプログラミングが大幅に簡素化されます。宣言的代入または new キーワードを利用すると、あらゆる型の新しいインスタンスをシームレスに作成でき、手動でのキャストやエラーが発生しやすい型アサーションの必要がなくなります。
以上がGo 1.18 のジェネリックスは、プログラムのクラッシュを引き起こすことなく、型付きの値を作成する問題をどのように解決できるでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。