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