Go compile error: missing return at end of function
Fix the Go compiler error "missing return" when a function with a result type falls off the end of its body on some control-flow path.
Symptoms
- missing return at end of function
- A function that logically always returns still fails to compile
- The error appears after adding a case to an if/else or switch
Possible causes
- A branch (if without else, switch without default) does not return
- A panic or os.Exit was assumed to satisfy the return but the compiler disagrees
- A loop with a break can fall through to the end
- A return inside a closure is mistaken for the outer function return
Diagnosis steps
Locate the function named in the error
Interpretation
The message includes file:line; inspect which control-flow path can reach the closing brace without executing a return.
Add an explicit return on the uncovered path
Interpretation
An if without else that lacks a terminal return is the most common cause.
Run static analysis to confirm
go vet ./...Interpretation
vet and the compiler together confirm no remaining path falls through.
Root cause
Go performs a simple flow analysis: if a path through the function body can reach the final brace without a return statement, the function is rejected even when that path is logically unreachable. Missing else branches, switch statements without default, and loops that can exit are the usual sources.
Fix
Ensure every path returns. Add the missing else or a default case, place a return after a loop that may not execute, and avoid relying on panic for control flow. When a branch truly cannot occur, return a zero value or panic explicitly so intent is documented.
Verify the fix
Run `go build ./...`; it succeeds with no "missing return" error, and go vet reports nothing about the function.
Symptoms
Compilation fails with missing return at end of function for a function you believe always returns. It usually appears right after adding a branch or case, and the compiler points at the closing brace.
Diagnosis
Read the reported function and find a path with no terminal return:
func classify(n int) string {
if n > 0 {
return "positive"
}
// else missing -> falls through
}
Use go vet to corroborate after editing.
Fix
Cover the remaining path:
func classify(n int) string {
if n > 0 {
return "positive"
}
return "non-positive"
}
For switch statements add a default; for loops that may not iterate, add a return after the loop.
Verification
go build ./... now succeeds and go vet ./... is clean for the function, so no control-flow path reaches the end without a return.