← Danh sách bài học Bài 7/20

🔧 Bài 7: Hàm (Functions)

⏱️ 25 phút | 📚 Trung bình

🎯 Mục tiêu:

1. Tại Sao Cần Hàm?

Hàm giúp:

2. Khai Báo Hàm Cơ Bản

package main
import "fmt"

// Hàm không có tham số, không return
func sayHello() {
    fmt.Println("Xin chào!")
}

func main() {
    sayHello()  // Gọi hàm
    sayHello()  // Gọi lại
}

3. Hàm Có Tham Số (Parameters)

// Hàm với 1 tham số
func greet(name string) {
    fmt.Println("Xin chào,", name)
}

// Hàm với nhiều tham số
func add(a int, b int) {
    fmt.Println("Tổng:", a + b)
}

// Rút gọn khi cùng kiểu
func multiply(a, b int) {
    fmt.Println("Tích:", a * b)
}

func main() {
    greet("Minh")      // Xin chào, Minh
    add(5, 3)          // Tổng: 8
    multiply(4, 6)     // Tích: 24
}

4. Hàm Có Giá Trị Trả Về

// Return một giá trị
func add(a, b int) int {
    return a + b
}

// Return nhiều giá trị (đặc trưng của Go!)
func divide(a, b int) (int, int) {
    quotient := a / b
    remainder := a % b
    return quotient, remainder
}

func main() {
    sum := add(5, 3)
    fmt.Println("Tổng:", sum)
    
    q, r := divide(10, 3)
    fmt.Println("Thương:", q, "Dư:", r)
}
💡 Multiple returns rất hữu ích để trả về kết quả + error cùng lúc.

5. Named Return Values

// Đặt tên cho giá trị return
func calculate(a, b int) (sum int, diff int) {
    sum = a + b
    diff = a - b
    return  // naked return
}

func main() {
    s, d := calculate(10, 3)
    fmt.Println("Sum:", s, "Diff:", d)
}

6. Variadic Functions

Hàm nhận số lượng tham số không cố định.

// ... trước kiểu = variadic
func sum(numbers ...int) int {
    total := 0
    for _, n := range numbers {
        total += n
    }
    return total
}

func main() {
    fmt.Println(sum(1, 2))          // 3
    fmt.Println(sum(1, 2, 3, 4, 5)) // 15
    
    // Truyền slice với ...
    nums := []int{10, 20, 30}
    fmt.Println(sum(nums...))       // 60
}

7. Anonymous Functions

// Hàm không tên
func main() {
    // Gán vào biến
    double := func(x int) int {
        return x * 2
    }
    fmt.Println(double(5))  // 10
    
    // Gọi ngay lập tức (IIFE)
    result := func(a, b int) int {
        return a + b
    }(3, 4)
    fmt.Println(result)  // 7
}

📝 Tóm Tắt