ホームページ > バックエンド開発 > Golang > ジェネリックを使用せずに Go でジェネリック エラー処理を実装するにはどうすればよいですか?

ジェネリックを使用せずに Go でジェネリック エラー処理を実装するにはどうすればよいですか?

Susan Sarandon
リリース: 2024-11-04 12:48:01
オリジナル
349 人が閲覧しました

How to Implement Generic Error Handling in Go Without Generics?

Go での汎用エラー処理の実装

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

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