Hàm nâng cao
B1. Multiple return + Named return
Multiple return (đặc trưng Go)
func divide(a, b int) (int, error) {
if b == 0 {
return 0, errors.New("chia cho 0")
}
return a / b, nil
}
result, err := divide(10, 2)
Named return — tự động khai báo biến
func stats(nums []int) (sum, avg int) {
for _, n := range nums {
sum += n
}
avg = sum / len(nums)
return // return "trần" — trả về sum, avg tự động
}
👉 Dùng khi: hàm ngắn, giúp godoc rõ ràng. Tránh với hàm dài — dễ nhầm.
B2. Variadic function — Tham số biến thiên
func sum(nums ...int) int {
total := 0
for _, n := range nums {
total += n
}
return total
}
sum(1, 2, 3) // 6
sum(1, 2, 3, 4, 5) // 15
// Truyền slice vào variadic: dùng ...
arr := []int{1, 2, 3}
sum(arr...) // "spread" slice
Ví dụ nổi tiếng: fmt.Printf(format string, args ...any).
B3. Closure & Anonymous function
Anonymous function
func() { fmt.Println("chạy ngay!") }() // định nghĩa + gọi ngay
Closure — hàm "nhớ" biến bên ngoài
func counter() func() int {
count := 0
return func() int {
count++
return count
}
}
c := counter()
fmt.Println(c()) // 1
fmt.Println(c()) // 2
fmt.Println(c()) // 3
👉 Dùng nhiều trong: middleware HTTP, callback, factory function.
B4. init() function
Chạy tự động trước main(), dùng để khởi tạo package:
var db *sql.DB
func init() {
db, _ = sql.Open("postgres", "...")
}
⚠️ Cảnh báo: đừng lạm dụng — khó test. Ưu tiên khởi tạo tường minh trong main().