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

📚 Bài 8: Mảng và Slice

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

🎯 Mục tiêu:

1. Mảng (Array)

Mảng có kích thước cố định, không thể thay đổi.

// Khai báo mảng 5 phần tử int
var numbers [5]int
numbers[0] = 10
numbers[1] = 20
fmt.Println(numbers)  // [10 20 0 0 0]

// Khai báo và khởi tạo
colors := [3]string{"red", "green", "blue"}
fmt.Println(colors[0])  // red

// Để Go tự đếm
nums := [...]int{1, 2, 3, 4, 5}
fmt.Println(len(nums))  // 5
⚠️ Hạn chế của Array: Kích thước cố định, không thể thêm/bớt phần tử.

2. Slice - Linh Hoạt Hơn Array

Slice là "view" của array, có thể thay đổi kích thước.

// Tạo slice (không cần kích thước)
numbers := []int{1, 2, 3, 4, 5}
fmt.Println(numbers)  // [1 2 3 4 5]

// Tạo slice với make
scores := make([]int, 5)     // len=5, cap=5
scores2 := make([]int, 3, 5) // len=3, cap=5
fmt.Println(len(scores), cap(scores))
Array Slice
Kích thước cố định Kích thước linh hoạt
[5]int []int
Ít dùng Dùng nhiều

3. Thêm Phần Tử với append()

numbers := []int{1, 2, 3}

// Thêm 1 phần tử
numbers = append(numbers, 4)
fmt.Println(numbers)  // [1 2 3 4]

// Thêm nhiều phần tử
numbers = append(numbers, 5, 6, 7)
fmt.Println(numbers)  // [1 2 3 4 5 6 7]

// Gộp 2 slices
more := []int{8, 9}
numbers = append(numbers, more...)
fmt.Println(numbers)  // [1 2 3 4 5 6 7 8 9]
💡 Quan trọng: append trả về slice mới, phải gán lại!

4. Slice của Slice (Slicing)

nums := []int{0, 1, 2, 3, 4, 5}

// [start:end] - lấy từ start đến end-1
fmt.Println(nums[1:4])  // [1 2 3]
fmt.Println(nums[:3])   // [0 1 2]    (từ đầu)
fmt.Println(nums[2:])   // [2 3 4 5]  (đến cuối)
fmt.Println(nums[:])    // [0 1 2 3 4 5] (toàn bộ)

5. Duyệt Slice với range

fruits := []string{"Táo", "Cam", "Xoài"}

// Lấy cả index và value
for i, fruit := range fruits {
    fmt.Printf("%d: %s\n", i, fruit)
}

// Chỉ lấy value
for _, fruit := range fruits {
    fmt.Println(fruit)
}

// Chỉ lấy index
for i := range fruits {
    fmt.Println(i)
}

📝 Tóm Tắt