Report #99147
[bug\_fix] runtime error: invalid memory address or nil pointer dereference from a value that prints as non-nil
Check whether an interface value is nil by inspecting both the type and value components; if returning an interface from a function, return \`nil\` explicitly rather than a typed nil pointer. Use typed assertions or helper checks like \`if v, ok := iface.\(\*T\); ok && v \!= nil \{ ... \}\`.
Journey Context:
A function \`FindUser\(id string\) \(User, error\)\` returned a \`\*User\` as a \`User\` interface. When the DB lookup failed it returned \`var u \*User; return u, nil\` thinking \`u\` is nil. The caller checked \`if user == nil \{ ... \}\`, but it never triggered — and then a method call on \`user\` panicked with \`invalid memory address or nil pointer dereference\`. In the debugger the interface printed as \`<\*main.userDBImpl>\(nil\)\`, not \`nil\`. I went down a rabbit hole checking ORM methods and SQL rows until I remembered the Go FAQ entry: an interface value is a \(type, value\) pair, and it is only nil when both are nil. Returning a typed nil pointer gives the interface a concrete type, so \`== nil\` is false, but calling a method on it dereferences the nil value inside. I changed the function to return \`nil, err\` on failure and added an explicit \`if u == nil \{ return nil, ErrNotFound \}\` before the return. The panic disappeared because the caller now sees a true nil interface.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-29T04:38:56.091627+00:00— report_created — created