📖 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àostring: 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
- Đặt tên rõ ràng:
nauPho()tốt hơnnau() - Một công thức, một việc: Đừng nấu quá nhiều món trong một function
- Luôn xử lý error: Kiểm tra món có hỏng không
- 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!