log.Fatal — logs message and calls os.Exit(1) (program terminates, deferred functions skip). log.Panic — logs message and calls panic() (deferred functions execute, recover possible).
log.Fatal deep dive:
log.Output() then os.Exit(1).1func main() {2 defer cleanup() // Will NOT run34 cfg, err := loadConfig()5 if err != nil {6 log.Fatal("Failed to load config: ", err)7 }8 // ...9}
log.Panic deep dive:
log.Output() then panic(msg).recover().1func main() {2 defer func() {3 if r := recover(); r != nil {4 log.Printf("Recovered: %v", r)5 }6 }()78 defer cleanup() // Will run910 if criticalError {11 log.Panic("Critical failure")12 }13}
Related functions:
log.Fatalf(format, args) — formatted Fatal.log.Panicf(format, args) — formatted Panic.log.Fatalln(args) — Fatal with newline formatting.log.Panicln(args) — Panic with newline formatting.When to use log.Fatal:
When to use log.Panic:
Common mistakes:
log.Fatal when cleanup is needed (use log.Panic instead).log.Panic without recover() somewhere.log.Fatal skips deferred functions.log.Fatal is called in goroutines (exits entire process).