← Danh sách bài học
Bài 7/20
🔧 Bài 7: Hàm (Functions)
🎯 Mục tiêu:
- Tạo và gọi hàm
- Parameters và arguments
- Return values, multiple returns
- Named return, variadic functions
1. Tại Sao Cần Hàm?
Hàm giúp:
- Tái sử dụng code: Viết một lần, dùng nhiều lần
- Tổ chức code: Chia nhỏ vấn đề thành các phần
- Dễ debug: Kiểm tra từng phần riêng biệt
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
func name(params) returnType {}- Go hỗ trợ multiple return values
- Named returns: đặt tên cho giá trị trả về
- Variadic:
func sum(nums ...int) - Anonymous functions: hàm không tên