Skip to main content

📖 Công Thức Nấu Ăn - Functions

Chào mừng đến với bài học về Functions - các công thức nấu ăn trong Bếp Á!

🎯 Món Ăn Hôm Nay

Function = Công thức nấu ăn

Giống như trong nhà hàng:

  • Công thức Phở: Có nguyên liệu đầu vào → Nấu → Ra tô phở
  • Công thức Bún Chả: Có nguyên liệu khác → Nấu → Ra đĩa bún chả

🥘 Function Là Gì?

Function (hàm) là một công thức nấu ăn được viết sẵn, dùng đi dùng lại nhiều lần!

func nauPho(khoThit int, nuocDung int) string {
// Các bước nấu phở
return "Tô Phở Nóng Hổi"
}

Cấu Trúc Công Thức:

  • func: Từ khóa khai báo "đây là công thức"
  • nauPho: Tên công thức (tên món)
  • (khoThit int, nuocDung int): Nguyên liệu đầu vào
  • string: Loại món ăn ra (kiểu trả về)
  • return: Món ăn hoàn thành

📝 Các Loại Công Thức

1. Công Thức Đơn Giản

func chaoKhach() {
fmt.Println("🏪 Xin chào! Mời quý khách dùng món!")
}

// Sử dụng:
func main() {
chaoKhach() // Gọi món
}

2. Công Thức Có Nguyên Liệu (Parameters)

func nauPho(loaiThit string, soLuong int) {
fmt.Printf("🍜 Nấu %d tô phở %s\n", soLuong, loaiThit)
}

// Sử dụng:
nauPho("bò tái", 2) // Output: Nấu 2 tô phở bò tái

3. Công Thức Có Món Ăn Ra (Return Value)

func tinhTien(gia int, soLuong int) int {
tongTien := gia * soLuong
return tongTien
}

// Sử dụng:
tienCanTra := tinhTien(50000, 3) // 150,000 VND
fmt.Printf("💰 Tổng tiền: %d VND\n", tienCanTra)

4. Công Thức Trả Về Nhiều Thứ

func datMon(tenMon string) (string, int, error) {
if tenMon == "Phở Bò" {
return "Phở Bò", 50000, nil // Thành công
}
return "", 0, errors.New("Hết món!")
}

// Sử dụng:
mon, gia, loi := datMon("Phở Bò")
if loi != nil {
fmt.Println("❌ Lỗi:", loi)
} else {
fmt.Printf("✅ Đặt %s - Giá: %d\n", mon, gia)
}

🔥 Thực Hành Trong Bếp

Bài Tập 1: Công Thức Tính Tiền

package main

import "fmt"

func tinhTongHoaDon(giaPho int, giaBunCha int) int {
return giaPho + giaBunCha
}

func main() {
tongTien := tinhTongHoaDon(50000, 45000)
fmt.Printf("💰 Tổng hóa đơn: %d VND\n", tongTien)
}

Bài Tập 2: Công Thức Giảm Giá

func apDungGiamGia(giaGoc int, phanTramGiam int) int {
giamGia := giaGoc * phanTramGiam / 100
return giaGoc - giamGia
}

// Sử dụng:
giaMoi := apDungGiamGia(100000, 20) // Giảm 20%
fmt.Printf("Giá sau giảm: %d VND\n", giaMoi) // 80,000 VND

Bài Tập 3: Variadic Function (Tính Tổng Nhiều Món)

func tinhTongNhieuMon(giaMonAn ...int) int {
tong := 0
for _, gia := range giaMonAn {
tong += gia
}
return tong
}

// Sử dụng:
tong := tinhTongNhieuMon(50000, 45000, 30000, 60000)
fmt.Printf("💵 Tổng: %d VND\n", tong) // 185,000 VND

⚠️ Những Lỗi Đầu Bếp Thường Gặp

Lỗi 1: Quên Return

// ❌ SAI: Không trả về món
func nauPho() string {
fmt.Println("Đang nấu...")
// Quên return!
}

// ✅ ĐÚNG: Phải trả về món
func nauPho() string {
fmt.Println("Đang nấu...")
return "🍜 Phở Bò"
}

Lỗi 2: Sai Kiểu Dữ Liệu

// ❌ SAI: Trả về sai kiểu
func tinhTien() string {
return 50000 // Số không phải string!
}

// ✅ ĐÚNG:
func tinhTien() int {
return 50000
}

Lỗi 3: Không Xử Lý Error

// ❌ SAI: Bỏ qua lỗi
mon, _, _ := datMon("Bún Bò Huế")

// ✅ ĐÚNG: Kiểm tra lỗi
mon, gia, err := datMon("Bún Bò Huế")
if err != nil {
fmt.Println("❌ Lỗi:", err)
return
}
fmt.Printf("✅ %s - %d VND\n", mon, gia)

💡 Bí Quyết Của Đầu Bếp

  1. Đặt tên rõ ràng: nauPho() tốt hơn nau()
  2. Một công thức, một việc: Đừng nấu quá nhiều món trong một function
  3. Luôn xử lý error: Kiểm tra món có hỏng không
  4. Comment công thức: Giải thích các bước phức tạp

🎓 Bạn Đã Học Được

  • ✅ Function = Công thức nấu ăn, dùng đi dùng lại
  • ✅ Parameters = Nguyên liệu đầu vào
  • ✅ Return value = Món ăn hoàn thành
  • ✅ Multiple returns = Trả về món + thông báo lỗi
  • ✅ Variadic = Nhận nhiều nguyên liệu linh hoạt

🍜 Món Tiếp Theo

Bây giờ bạn đã biết viết công thức! Tiếp theo học cách lưu trữ nhiều nguyên liệu:

👉 Kệ Đựng Gia Vị - Arrays & Slices


💡 Lời Khuyên Cuối: Viết functions giống như viết công thức - càng rõ ràng, càng dễ dùng lại! Hãy thực hành viết nhiều công thức khác nhau!