Go での Nil および Nil インターフェースの確認
Go でインターフェースを操作する場合、インターフェースが nil か nil であるかを確認する必要があることがよくあります。 nil値が含まれています。ただし、リフレクションを使用した標準的なアプローチは冗長でエラーが発生しやすい可能性があります。
たとえば、次のヘルパー関数について考えてみましょう。
func isNil(a interface{}) bool { defer func() { recover() }() return a == nil || reflect.ValueOf(a).IsNil() }
この関数はリフレクションを使用して、値が nil かどうかを確認します。ただし、値の型がサポートされていない場合にパニックを処理するには、遅延 Recovery() が必要です。
より直接的な方法アプローチ
元の質問への答えが示唆しているように、よりシンプルで信頼性の高いアプローチは、nil インターフェースの直接比較を使用し、型なしインターフェースへの nil の代入を常に許可することです。
func isNil(a interface{}) bool { return a == nil }
この関数は、nil インターフェースとインターフェース内の nil 値の両方を正しくチェックします。
(*T)(nil) の代入が許可されている場合
上で概説したアプローチは、(*T)(nil) をオブジェクトに代入しないことを前提としています。インターフェース。そうでない場合は、リフレクションを使用して nil 値をチェックする必要がある場合があります:
func isNil(a interface{}) bool { if a == nil { return true } v := reflect.ValueOf(a) if v.Kind() == reflect.Ptr && v.IsNil() { return true } return false }
ただし、(*T)(nil) をインターフェイスに割り当てることは避けることをお勧めします。微妙なバグまで。 (*T)(nil) をインターフェースに決して格納しないというルールを強制することで、コードを簡素化し、信頼性を高めることができます。
以上がGo で Nil インターフェイスと Nil 値を確実にチェックするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。