問題は、エラー インターフェイスとしてチャネルに渡される値nil
が ではなく、exec.Error
nil を指すポインタであることです。
次のように変更すると、プログラムは正しく動作します。
go func() {
var e *exec.Error = nil
if e == nil {
errChan <- nil
}
}()
エラーが発生しなかったことを報告する慣用的な方法は、nil エラー インターフェイスを渡すことであるため、これが問題を解決する適切な方法です。
ただし、代わりにメインを変更する場合 (おそらく nil に設定されたポインターを返すという間違いを犯すサードパーティのパッケージを使用しているため)、特定の型 (*exec.Error) に対して型アサーションを実行する必要があります。 nil かどうかを確認するか、relect パッケージを使用します。
Reflect を使用して nil をチェックする例:
func IsNil(i interface{}) bool {
// Check if it is an actual nil-value
if i == nil {
return true
}
v := reflect.ValueOf(i)
switch v.Kind() {
// Only the following kinds can be nil
case reflect.Chan, reflect.Func, reflect.Interface, reflect.Map, reflect.Ptr, reflect.Slice:
return v.IsNil()
}
return false
}
作業例: http://play.golang.org/p/rpG1PVTwwM
ここでそれに関する議論を見つけることができます: https://groups.google.com/forum/#!topic/golang-nuts/QzVDKv7p0Vs