ホームページ > バックエンド開発 > Golang > Go で Nil インターフェイスと Nil 値を確実にチェックするにはどうすればよいですか?

Go で Nil インターフェイスと Nil 値を確実にチェックするにはどうすればよいですか?

Mary-Kate Olsen
リリース: 2024-12-11 19:07:12
オリジナル
385 人が閲覧しました

How Can I Reliably Check for Nil Interfaces and Nil Values in Go?

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート