← Danh sách bài học
Bài 8/20
📚 Bài 8: Mảng và Slice
🎯 Mục tiêu:
- Hiểu sự khác biệt Array vs Slice
- Tạo và thao tác với slice
- append, len, cap
- Duyệt với range
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
- Array:
[5]int- kích thước cố định - Slice:
[]int- linh hoạt, dùng nhiều hơn make([]int, len, cap)tạo sliceappend(slice, items...)thêm phần tửslice[start:end]cắt slicerangeduyệt slice