Go - Slices: Hướng dẫn cơ bản về mảng động
Xin chào các bạn lập trình viên tương lai của Go! Hôm nay, chúng ta sẽ cùng tìm hiểu một trong những cấu trúc dữ liệu linh hoạt và mạnh mẽ nhất của Go: slices. Hãy tưởng tượng slices như những chiếc dao đa năng của lập trình Go - chúng linh hoạt, hiệu quả, và một khi bạn thành thạo chúng, bạn sẽ tự hỏi làm thế nào mà bạn từng viết mã mà không có chúng!
slices là gì?
Trước khi chúng ta bắt đầu, hãy cùng setup sân khấu. Hãy tưởng tượng bạn đang lên kế hoạch cho một buổi tiệc (tất nhiên là buổi tiệc lập trình rồi!). Bạn cần một danh sách khách mời, nhưng bạn không chắc chắn có bao nhiêu người sẽ đến. Đây chính là điểm mạnh của slices! Chúng giống như những danh sách khách mời động có thể mở rộng hoặc thu nhỏ theo nhu cầu.
Trong Go, một slice là một khung nhìn linh hoạt, động vào một mảng. Nó giống như một cửa sổ có thể điều chỉnh kích thước, cho phép bạn làm việc với một phần của mảng hoặc thậm chí tạo ra một mảng hoàn toàn mới trên không.
Định nghĩa một slice
Hãy bắt đầu bằng cách tạo slice đầu tiên của chúng ta. Có nhiều cách để làm điều này, hãy cùng khám phá chúng một lần một.
Phương pháp 1: Sử dụng hàm make()
guestList := make([]string, 3)
fmt.Println(guestList) // Output: [ ]
Trong ví dụ này, chúng ta đã tạo một slice của các chuỗi với độ dài ban đầu là 3. Nó giống như việc chuẩn bị ba chiếc ghế trống cho buổi tiệc của chúng ta. Hàm make()
giống như người tổ chức buổi tiệc, chuẩn bị không gian cho khách của chúng ta.
Phương pháp 2: Sử dụng literal slice
guestList := []string{"Alice", "Bob", "Charlie"}
fmt.Println(guestList) // Output: [Alice Bob Charlie]
Ở đây, chúng ta đang tạo một slice và ngay lập tức điền khách mời vào. Nó giống như việc có một danh sách VIP sẵn sàng!
Phương pháp 3: Slice từ một mảng hiện có
partyRoom := [5]string{"Alice", "Bob", "Charlie", "David", "Eve"}
vipGuests := partyRoom[0:3]
fmt.Println(vipGuests) // Output: [Alice Bob Charlie]
Trong trường hợp này, chúng ta đang tạo một slice từ một mảng hiện có. Nó giống như việc chọn ba người đầu tiên từ phòng tiệc của chúng ta để vào danh sách VIP.
Các hàm len()
và cap()
Bây giờ chúng ta đã có danh sách khách mời, hãy nói về hai hàm quan trọng: len()
và cap()
.
guestList := make([]string, 3, 5)
fmt.Printf("Độ dài: %d, Dung lượng: %d\n", len(guestList), cap(guestList))
// Output: Độ dài: 3, Dung lượng: 5
-
len()
cho chúng ta biết hiện có bao nhiêu khách trong danh sách của chúng ta. -
cap()
cho chúng ta biết danh sách của chúng ta có thể chứa bao nhiêu khách trước khi cần phải mở rộng.
Hãy tưởng tượng len()
là số lượng ghế đã được chuẩn bị, và cap()
là tổng số ghế có sẵn trong phòng tiệc.
Slice nil
Đôi khi, bạn có thể khai báo một slice nhưng không�始化 nó. Điều này được gọi là slice nil.
var emptyList []string
fmt.Println(emptyList == nil) // Output: true
Một slice nil giống như việc bạn có ý tưởng về danh sách khách mời nhưng chưa thực sự tạo danh sách. Điều này hoàn toàn hợp lệ và có thể hữu ích trong một số tình huống!
Subslicing
Subslicing giống như việc tạo một khu vực VIP trong buổi tiệc của bạn. Bạn có thể chọn một phần của slice hiện có để tạo ra một slice mới.
fullGuestList := []string{"Alice", "Bob", "Charlie", "David", "Eve"}
vipGuests := fullGuestList[1:4]
fmt.Println(vipGuests) // Output: [Bob Charlie David]
Ở đây, chúng ta đang chọn khách từ chỉ số 1 đến 3 (nhớ rằng chỉ số cuối là không bao gồm) để trở thành khách VIP.
Các hàm append()
và copy()
append()
Hàm append()
giống như việc có một bảo vệ có thể thêm khách mới vào buổi tiệc của bạn.
guestList := []string{"Alice", "Bob"}
guestList = append(guestList, "Charlie")
fmt.Println(guestList) // Output: [Alice Bob Charlie]
Bạn thậm chí có thể thêm nhiều khách cùng một lúc:
guestList = append(guestList, "David", "Eve")
fmt.Println(guestList) // Output: [Alice Bob Charlie David Eve]
copy()
Hàm copy()
giống như việc có một người tổ chức buổi tiệc có thể sao chép danh sách khách mời của bạn.
originalList := []string{"Alice", "Bob", "Charlie"}
newList := make([]string, len(originalList))
copiedElements := copy(newList, originalList)
fmt.Printf("Sao chép %d phần tử. Danh sách mới: %v\n", copiedElements, newList)
// Output: Sao chép 3 phần tử. Danh sách mới: [Alice Bob Charlie]
Bảng tóm tắt các phương pháp slice
Dưới đây là bảng tóm tắt các phương pháp slice chính mà chúng ta đã thảo luận:
Phương pháp | Mô tả | Ví dụ |
---|---|---|
make() |
Tạo một slice | make([]int, 5) |
len() |
Trả về độ dài của slice | len(slice) |
cap() |
Trả về dung lượng của slice | cap(slice) |
append() |
Thêm phần tử vào slice | slice = append(slice, 1, 2, 3) |
copy() |
Sao chép phần tử từ slice này sang slice khác | copy(destSlice, sourceSlice) |
Subslicing | Tạo một slice mới từ slice hiện có | newSlice := slice[1:4] |
Và thế là bạn đã bước vào thế giới kỳ diệu của slices trong Go! Nhớ rằng, thực hành là cách tốt nhất để thành thạo, vì vậy đừng ngần ngại thử nghiệm với các khái niệm này. Tạo danh sách khách mời của riêng bạn, chơi với việc thêm và sao chép, và sớm bạn sẽ.slice và xén qua mã Go như một chuyên gia!
Chúc các bạn lập trình vui vẻ, và mong rằng slices của bạn luôn phù hợp với nhu cầu của bạn!
Credits: Image by storyset