ホームページ >バックエンド開発 >Golang >Go 1.18 で JSON アンマーシャリングにジェネリックを使用できますか?

Go 1.18 で JSON アンマーシャリングにジェネリックを使用できますか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-30 22:22:03645ブラウズ

Can Generics Be Used for JSON Unmarshaling in Go 1.18?

Go 1.18 のジェネリックスとアンマーシャル

Go 1.18 では、ジェネリックスにより言語に強化された型安全性がもたらされます。ただし、JSON データのアンマーシャリングと組み合わせてジェネリックを使用する場合は、特定の制限が発生します。

それぞれが ReportContainerImpl にカプセル化された複数のレポート タイプが関係するシナリオを考えてみましょう。コンテナには、Reportable インターフェイスを実装するように制約されたパラメータが含まれており、さまざまなレポート タイプを表します。ただし、Go では構造体および生のジェネリック型へのポインターでの型アサーションがサポートされていないため、アンマーシャリングには課題が生じます。

これに対処するために、インターフェイス ReportContainer が導入され、ReportContainerImpl で実装できるようになりました。ただし、GetBody() の戻り値の型に型制約を強制することはできないため、アンマーシャリング中に型アサーションが必要になります。

難題は、コンパイル中にジェネリック型パラメーターが既知である必要があるという事実にありますが、JSON はそうではありません。アンマーシャリングは、動的データの実行時に行われます。

課題の克服

最も実行可能な解決策は、この特定の使用例ではパラメトリック ポリモーフィズムを放棄することです。既存の json.RawMessage アプローチを維持し、switch ステートメント内で動的データを条件付きでアンマーシャルし、ReportContainer インターフェイスを実装する具象構造体を返すことをお勧めします。

代替ソリューション: 汎用アンマーシャル関数

コンパイル時に型パラメータが分かるシナリオでは、次のように汎用アンマーシャリング関数を使用できます。

<code class="go">func unmarshalAny[T any](bytes []byte) (*T, error) {
    out := new(T)
    if err := json.Unmarshal(bytes, out); err != nil {
        return nil, err
    }
    return out, nil
}</code>

これは汎用アンマーシャリングの概念を示していますが、次のことに注意してください。 Go の json.Unmarshal は、すでにあらゆる型へのアンマーシャリングをサポートしています。したがって、カスタム ジェネリック関数は追加の価値を提供することなく、複雑さを増すだけです。

結論として、Go で動的 JSON データを処理し、アンマーシャリングする場合は、インターフェースと型アサーションを適切に使用することにより型安全性を優先することをお勧めします。パラメトリック多態性。

以上がGo 1.18 で JSON アンマーシャリングにジェネリックを使用できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。