Functions and Methods
The Refactoring That Changed My Mind
def authenticate_user(email, password):
try:
user = database.get_user(email)
if check_password(user, password):
return create_token(user)
else:
return None
except UserNotFound:
return None
except DatabaseError as e:
log_error(e)
return Nonefunc authenticateUser(email, password string) (string, error) {
user, err := database.GetUser(email)
if err != nil {
return "", fmt.Errorf("failed to get user: %w", err)
}
if !checkPassword(user, password) {
return "", errors.New("invalid credentials")
}
token, err := createToken(user)
if err != nil {
return "", fmt.Errorf("failed to create token: %w", err)
}
return token, nil
}Function Declaration
Basic Function
Function with Return Value
Multiple Parameters of Same Type
Multiple Return Values
Returning Multiple Values
Real-World Example: File Reading
Ignoring Return Values
Named Return Values
Named Returns for Clarity
Variadic Functions
Passing Slice to Variadic Function
Real Example: Logging Function
Functions as Values
Assign Function to Variable
Anonymous Functions
Immediately Invoked Function
Real Example: Middleware Pattern
Closures
Real Example: Rate Limiter
Methods on Types
Method Declaration
Value Receivers vs Pointer Receivers
Real Example: HTTP Client
Methods on Non-Struct Types
Real Example: Custom String Type
Function Types
Real Example: Validation Pipeline
Defer with Functions
Defer for Timing
Practical Example: Builder Pattern
Common Patterns
Options Pattern
Your Challenge
Key Takeaways
What I Learned
Last updated