83

現在、このヘルパー関数を使用して nil および nil インターフェイスをチェックしています

func isNil(a interface{}) bool {
  defer func() { recover() }()
  return a == nil || reflect.ValueOf(a).IsNil()
}

値の Kind が、、、、またはreflect.ValueOf(a).IsNil()以外の場合はパニックになるため、それらをキャッチするために deferredを投入しました。ChanFuncMapPtrInterfaceSlicerecover()

このチェックを達成するためのより良い方法はありますか? これを行うには、もっと簡単な方法が必要だと思います。

4

7 に答える 7

43

たとえば、golang-nutsメーリングリストのこのスレッドにあるKyleの回答を参照してください。

つまり(*T)(nil)、インターフェイスに保存しない場合は、nilとの比較を確実に使用でき、リフレクションを使用する必要はありません。一方、型指定されていないnilをインターフェイスに割り当てることは常に問題ありません。

于 2012-11-20T15:43:14.887 に答える
0

インターフェイスに入力する関数でエラーを使用してみてください。

パッケージ a

func getObj() (obj *someObject, err error) {
   obj = db.getA()
   if obj == nil {
      err = fmt.Errorf("Some error")
   }
   return
}

パッケージb

import a

var i interface{}

i, err = a.getObj()
if err != nil {
   // catch err
} else {
   // do next step
}
于 2021-08-06T10:47:51.423 に答える