Go には汎用機能がないため、機能を一般化しようとすると課題が生じます。一般的なシナリオは、値とエラーを返すあらゆる関数に適用できる汎用エラー処理関数の必要性です。
提供された例は、空のインターフェイスを使用してそのような関数を作成する試みを示しています。
<code class="go">func P(any interface{}, err error) (interface{}) { if err != nil { panic("error: "+ err.Error()) } return any }</code>
このアプローチはエラー処理には機能しますが、型情報が失われ、結果のインターフェイスは空のままになります。
型情報の損失の問題を回避するには、コード生成を使用して、さまざまなタイプに特化したエラー処理関数の実装を作成することを検討してください。これは、「go generated」、「gengen」、「genny」、または「gen」などのツールを使用して実現できます。
たとえば、「gen」を使用すると、テンプレートを定義できます。
<code class="text">// template.go package main import "fmt" func P[T any](v T, err error) (T) { if err != nil { panic(fmt.Sprintf("error: %v", err)) } return v }</code>
このテンプレートは、P() の型固有の実装を生成するために使用できます:
<code class="sh">gen generate</code>
これにより、次のような実装が作成されます:
<code class="go">// p_int.go package main func PInt(v int, err error) (int) { if err != nil { panic(fmt.Sprintf("error: %v", err)) } return v }</code>
これらの生成された関数を使用することにより、 、型情報が保持され、エラー処理を特定の型にシームレスに適用できます。
以上がジェネリックを使用せずに Go でジェネリック エラー処理を実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。