ホームページ >バックエンド開発 >Golang >構造体をスライスにアンマーシャリングするためのジェネリック型定義

構造体をスライスにアンマーシャリングするためのジェネリック型定義

王林
王林転載
2024-02-06 08:54:041131ブラウズ

構造体をスライスにアンマーシャリングするためのジェネリック型定義

質問内容

通常、配列を含むオブジェクトとして配列を返す API があります。例として次の例を考えてみましょう:

リーリー

API はこれを数十の場所で毎回異なる名前で実行します。これは 2 つのキーのみで確実に発生します。1 つは number で、もう 1 つは配列です。

これにより、不必要なレベルのフィールドを常に参照しなければならないため、結果として得られる構造はかなり使いにくくなります。

基本的に、Go インターフェースに次の形式があるかのように見せたいのです:

リーリー

1 つのオプションは、オカレンスごとにカスタム UnmarshalJSON 関数を記述することですが、特にこれがほぼすべての構造に現れることを考えると、これは面倒に思えます。私が思いついた解決策は、それを単独で処理できる汎用タイプです。

私の現在の試みは次のとおりです:

リーリー

使用方法は次のとおりです:

リーリー

を実行すると次のエラーが発生します:

リーリー

UnmarshalJSON デバッガーが sliceVal を期待どおりに示しているため、コードの大部分は正しいようです。型 NestedArray[T] に戻すアンマーシャリング中にエラーが発生しました。

この問題を解決する方法はありますか?私が今やっていることよりも良い方法はありますか?私にはこれが最もクリーンだと思われますが、提案を歓迎します。


正解


メソッド NestedArray[T].UnmarshalJSON はそれ自体を再帰的に呼び出します。内部呼び出しでは、bytes の JSON オブジェクトが必要ですが、JSON 配列を受け取るため、エラーがスローされます。 NestedArray[T] ではなく []T にアンマーシャリングすることで修正されました。

エラーとは関係なく、メソッド NestedArray[T].UnmarshalJSON が不必要なエンコードとデコードを実行しました。 json.RawMessage を使用して修正してください。

これは 2 つの修正を加えたコードです:

リーリー

プレイグラウンドでコードを実行してください。

以上が構造体をスライスにアンマーシャリングするためのジェネリック型定義の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はstackoverflow.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。