Never mind- that doesn't actually make a difference.
The solution in this case is to not re-use an existing error variable- but re-use of an error variable is common practice.
Yea, the issue is that nil's in Go are typed. So `err == nil` is checking err against error's nil value, but the value stored in err is *MyError's nil value.
package main
import "fmt"
type MyError struct{}
func (m *MyError) Error() string {
return ""
}
func main() {
var err error = nil
var myErr *MyError = nil
fmt.Println(err == myErr) // this is false
}
Comparing different types normally is a type error. But for interfaces the non-interface value will be converted to the type of the interface value. This conversion gives it a boxed dynamic type. This is different type than just assigning nil, which is the untyped nil, which sets the interface to its zero value.
Normally one would not compare two interface values, so this issue really comes up when comparing an interface to nil. If Go had proper option types then this issue would go away.
var err error = nil
var myErr1 *Err1 = nil
var myErr2 *Err2 = nil
fmt.Println(err == myErr1) // this is false
fmt.Println(err == myErr2) // this is false
fmt.Println((error)(myErr1) == (error)(myErr2)) // this is false. requires the cast to do the comparison
}