gotchagoMajor
Go interface nil check fails — typed nil vs untyped nil
Viewed 0 times
typed nilinterface nilnil check failserror interfacefat pointer
Error Messages
Problem
A Go function returns an interface that is checked with if err != nil, but the check passes (not nil) even though the underlying value is nil. Causes unexpected behavior in error handling.
Solution
An interface in Go has two components: (type, value). A typed nil (MyError)(nil) stored in an interface is NOT equal to nil because the type field is set. Fix: (1) Return the interface type directly, not a concrete nil pointer: return nil instead of return (MyError)(nil). (2) Use errors.As() for type checking. (3) In functions returning error, always use error as return type and return bare nil.
Why
Go interfaces are fat pointers containing (type, value). nil interface means both are nil. A nil pointer assigned to an interface sets the type but not the value, making the interface non-nil.
Revisions (0)
No revisions yet.