问题在于作为错误接口传入通道的值不是nil
,而是exec.Error
指向 nil 的指针。
如果您更改,程序将正常运行:
go func() {
var e *exec.Error = nil
if e == nil {
errChan <- nil
}
}()
这是解决问题的合适方法,因为报告未发生错误的惯用方法是传递一个 nil 错误接口。
但是,如果您想更改 main 代替(可能是因为您使用了第三方包,该包导致返回指针设置为 nil 的错误),您将不得不对特定类型进行类型断言 (*exec.Error)然后检查它是否为零,否则使用反射包。
使用反射检查 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