Go の「Unmarshal」関数で型アサーションに頼らずにタイプセーフな JSON 解析を行うためにジェネリック型を使用するにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-10-30 01:08:02
オリジナル
506 人が閲覧しました

How can I use generic types in Go's `Unmarshal` function for type-safe JSON parsing without resorting to type assertions?

Unmarshal のジェネリック、詳細

Go のジェネリックは、より再利用可能でタ​​イプセーフなコードを作成するための強力なツールです。ただし、アンマーシャルでジェネリックスを使用する場合、注意しなければならないいくつかの課題があります。

この Q&A では、ユーザーはジェネリックスを使用して、より型安全なアンマーシャル方法を作成しようとしています。 JSON データを構造体に格納します。彼らが直面している問題は、GetBody() 関数で型制約を使用できないことです。そのため、コード内で型アサーションを使用する必要があります。

その理由は、Go が機能するためです。構造体の型アサーションはサポートされず、インターフェイスのみがサポートされます。これは、構造体の正確な型を最初に知らなければ、GetBody() 関数を特定の型にキャストできないことを意味します。

この問題に対する考えられる解決策の 1 つは、switch ステートメントを使用して、構造体の ReportType フィールドをチェックすることです。構造体を取得し、GetBody() 関数を適切な型にキャストします。ただし、この解決策はあまり洗練されておらず、構造体に含めることができるさまざまな型の数が増えると維持が困難になる可能性があります。

この問題に対するより良い解決策は、 GetBody() 関数。これにより、switch ステートメントを使用せずに GetBody() 関数を適切な型にキャストできるようになります。これはより洗練されたソリューションであり、保守性も向上しています。

このソリューションを説明するために、GetBody() 関数の修正バージョンを次に示します。

<code class="go">func (c *ReportContainerImpl[T]) GetBody() (T, error) {
    var body T
    var err error
    switch c.ReportType {
    case ReportTypeExportDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeImportDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeMissingDataPointReport:
        err = json.Unmarshal(c.Body, &body)
    case ReportTypeSensorThresoldReport:
        err = json.Unmarshal(c.Body, &body)
    }
    return body, err
}</code>
ログイン後にコピー

この変更により、 GetBody() 関数を使用して、switch ステートメントを使用せずに構造体の本体を取得できるようになりました。これにより、コードがよりエレガントになり、保守が容易になります。

以上がGo の「Unmarshal」関数で型アサーションに頼らずにタイプセーフな JSON 解析を行うためにジェネリック型を使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!