| name | go-nil-interface |
| description | Interface nil trap - typed nil is not nil |
Interface Nil Trap
Problem
A typed nil pointer stored in an interface is NOT nil.
Pattern
WRONG - Typed nil escapes
func GetUser(id int) error {
var err *MyError
if id < 0 {
err = &MyError{"invalid id"}
}
return err
}
if err := GetUser(1); err != nil {
fmt.Println("error:", err)
}
CORRECT - Return untyped nil
func GetUser(id int) error {
if id < 0 {
return &MyError{"invalid id"}
}
return nil
}
if err := GetUser(1); err != nil {
fmt.Println("error:", err)
}
Why It Happens
Interface contains (type, value). Typed nil has (type=*MyError, value=nil).
This is different from (type=nil, value=nil).
Quick Fix