Here's what you learned in this section:
Go uses error values instead of exceptions
Functions return errors as the last value, nil means success
Always check errors with if err != nil
Use fmt.Errorf with %w to wrap errors with context
errors.Is checks for specific errors in the chain
errors.As extracts custom error types
Panic is for programming bugs, not runtime failures
recover() catches panics inside deferred functions