KHOÁ HỌC Phần 2 — 20% còn lại Hàm nâng cao

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().

← Kiểu dữ liệu nâng cao