インターフェイスによる汎用エラー処理: ジレンマ
Go では汎用プログラミングが依然としてとらえどころがなく、開発者は代替案を模索しています。結果とエラーの両方を返す関数を扱うときに、一般的な問題が 1 つ発生します。
問題:
以下のコード スニペットは、パニックを引き起こす汎用関数 P を定義しようとしています。エラー時:
<code class="go">func P(any interface{}, err error) (interface{}) { if err != nil { panic("error: " + err.Error()) } return any }</code>
ただし、any を使用すると型情報が失われます。これは、特にライブラリ関数を呼び出す場合に問題となる可能性があります。
解決策の検討:
1 つの方法は、必要な特定の型ごとに P 関数の調整されたバージョンを手動で生成することです。扱うこと。これは go generated コマンドを使用して実現できます。
<code class="go">//go:generate genny -in=./template.go -out=./p_gen.go gen "anytype,error,string"</code>
これにより、指定された型に特化した P 関数が生成されます。
別の解決策には、golangci-lint などの go-lint ツールの使用が含まれます。
結論:
Go には明示的な汎用構文がありませんが、次を使用して汎用の動作をシミュレートする方法があります。代替構造。ただし、interface{} を使用する際の型情報の損失など、関連する潜在的な注意事項や制限事項を認識し、それに応じてコードを調整することが重要です。
以上が型の安全性を犠牲にすることなく、Go で一般的なエラー処理を実現するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。