I get that. But why define the Error method on a pointed receiver? In my experience almost all errors can be immutable particularly once you start using wrapping.
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
}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.
https://go101.org/article/nil.html
package main
import "fmt"
type Err1 struct{}
func (m Err1) Error() string { return "" }
type Err2 struct{}
func (m Err2) Error() string { return "" }
func main() {
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
}