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

王林
リリース: 2024-02-06 08:54:04
転載
1082 人が閲覧しました

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

質問内容

通常、配列を含むオブジェクトとして配列を返す 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 までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!