Sự khác biệt giữa khai báo Slice và Array trong Go lang là gì và tại sao Slice lại được sử dụng phổ biến hơn trong thực tế lập trình?
Bản chất cơ chế
- Array (Mảng): Có kích thước cố định được định nghĩa tại thời điểm biên dịch (compile-time). Kích thước là một phần của kiểu dữ liệu (ví dụ:
[3]intkhác với[5]int). Array được truyền theo dạng Pass by Value (sao chép toàn bộ phần tử khi gán hoặc truyền vào hàm). - Slice (Lát cắt): Là một cấu trúc dữ liệu động linh hoạt hơn, bao gồm 3 thành phần: Con trỏ trỏ tới mảng ngầm định (Pointer), Độ dài hiện tại (Length), và Sức chứa tối đa (Capacity). Slice là kiểu tham chiếu nhẹ.
Tại sao Slice phổ biến hơn?
- Kích thước linh hoạt, có thể mở rộng thông qua hàm dựng sẵn
append(). - Tiết kiệm bộ nhớ khi truyền vào hàm vì chỉ copy cấu trúc descriptor 24 bytes gồm pointer, len, cap chứ không copy toàn bộ mảng dữ liệu bên dưới.
Ví dụ minh họa
// Khai báo Array cố định
var arr [3]int = [3]int{1, 2, 3}
// Khai báo Slice động
var slice []int = []int{1, 2, 3}
slice = append(slice, 4)
Lưu ý kinh nghiệm thực chiến
Khi dùng append() trên Slice, nếu vượt quá Capacity, Go sẽ tự động cấp phát một vùng nhớ mới lớn gấp đôi và copy dữ liệu sang. Cần lưu ý hiện tượng rò rỉ bộ nhớ (Memory Leak) khi slice con trỏ tham chiếu đến một mảng lớn ban đầu khiến Garbage Collector không thể giải phóng vùng nhớ đó.
Làm Chủ Phỏng Vấn & Nâng Cao Trình Độ Chuyên Nghiệp
Hệ thống khóa học thực chiến chuẩn Enterprise giúp bạn tự tin chinh phục mọi kỳ phỏng vấn kỹ thuật và thăng tiến thu nhập.
Tải Tuyển Tập 100+ Câu Hỏi Phỏng Vấn Chuyên Sâu (PDF)
Bộ tài liệu chuẩn Senior do Unicode Academy tuyển chọn & biên soạn, hỗ trợ tải về định dạng PDF chuẩn in ấn.
Cần Mentor Phỏng Vấn Thử 1-1 & Tối Ưu CV?
Mô phỏng phỏng vấn kỹ thuật thực tế 1-1 qua Google Meet, nhận xét chi tiết điểm mạnh/yếu và sửa CV trực tiếp cùng giảng viên Unicode.
Kiểm Tra CV Chuẩn ATS Miễn Phí
Tải CV của bạn lên để hệ thống AI rà soát từ khóa kỹ năng, định dạng và tính điểm chuẩn nhà tuyển dụng.
Câu hỏi go lang liên quan cùng chủ đề
- Làm thế nào để tối ưu hóa hiệu năng và quản lý Goroutines concurrency trong dự án Go lang? Entry
- Làm thế nào để tối ưu hóa hiệu năng và quản lý GOPATH vs Modules trong dự án Go lang? Entry
- Cơ chế hoạt động của panic, recover và defer trong Go lang diễn ra như thế nào và best practices khi xử lý lỗi ngoại lệ? Junior
- Làm thế nào để quản lý Context trong Go lang nhằm kiểm soát thời gian timeout và hủy bỏ (cancellation) các tác vụ bất đồng bộ? Junior
- Trong Go lang, tại sao khi truyền một slice vào hàm để thay đổi dữ liệu bên trong thì phần tử được cập nhật nhưng khi thêm phần tử mới bằng hàm append lại không làm thay đổi kích thước của slice gốc ở hàm gọi? Hãy giải thích bản chất cấu trúc dữ liệu của slice. Junior


