Functional programming patterns in Go via generics and closures.
1// Map: transform elements2func Map[T any, U any](slice []T, fn func(T) U) []U {3 result := make([]U, len(slice))4 for i, v := range slice {5 result[i] = fn(v)6 }7 return result8}910// Filter: filtering11func Filter[T any](slice []T, fn func(T) bool) []T {12 result := make([]T, 0)13 for _, v := range slice {14 if fn(v) {15 result = append(result, v)16 }17 }18 return result19}2021// Reduce: fold22func Reduce[T any, U any](slice []T, init U, fn func(U, T) U) U {23 result := init24 for _, v := range slice {25 result = fn(result, v)26 }27 return result28}2930// FlatMap: transform + flatten31func FlatMap[T any, U any](slice []T, fn func(T) []U) []U {32 result := make([]U, 0)33 for _, v := range slice {34 result = append(result, fn(v)...)35 }36 return result37}3839// Take: first N elements40func Take[T any](slice []T, n int) []T {41 if n > len(slice) {42 n = len(slice)43 }44 return slice[:n]45}4647// Usage48users := []User{{Name: "Alice", Age: 25}, {Name: "Bob", Age: 30}}4950names := Map(users, func(u User) string { return u.Name })51// ["Alice", "Bob"]5253adults := Filter(users, func(u User) bool { return u.Age >= 18 })54// [{Alice 25}, {Bob 30}]5556totalAge := Reduce(users, 0, func(sum int, u User) int { return sum + u.Age })57// 555859// Method chaining60result := Take(61 Filter(62 Map(users, func(u User) string { return u.Name }),63 func(s string) bool { return len(s) > 3 },64 ),65 5,66)
Advantages: Readability, composition, reuse. Disadvantages: Allocations, performance (for hot paths).