Array
Array hay Mảng có hai thuộc tính:
- Chiều dài cố định
- Các phần tử cùng loại
Chính vì chiều dài cố định của nó mà nó được sử dụng ít hơn trong quá trình phát triển so với slice. Nhưng array là cơ sở của slice, sau khi hiểu array, việc học slice sẽ dễ dàng hơn rất nhiều.
Declaration and Initialization
Khai báo một mảng có độ dài 3 và kiểu phần tử int. Các phần tử mảng được truy cập theo chỉ mục, chỉ số nằm trong khoảng từ 0 đến độ dài của mảng trừ 1 và hàm tích hợp len
có thể lấy độ dài của mảng.
Giá trị ban đầu của mảng là giá trị mặc định của kiểu phần tử và mảng cũng có thể được khởi tạo bằng một array literal.
Nếu độ dài mảng không được chỉ định rõ ràng, nhưng …
được sử dụng, thì độ dài mảng được xác định bởi số lượng phần tử thực tế.
Bạn cũng có thể chỉ định vị trí chỉ số để khởi tạo, nếu độ dài mảng không được chỉ định thì độ dài được xác định bởi chỉ số.
Multidimensional Array
Việc khai báo và khởi tạo mảng nhiều chiều cũng vậy, ở đây lấy mảng hai chiều làm ví dụ, lưu ý một điều là chỉ cho phép chiều đầu tiên của mảng nhiều chiều dùng …
Sử dụng
Mảng có thể so sánh được miễn là các phần tử của chúng có thể so sánh được và độ dài mảng là một phần của kiểu mảng.
Vì vậy [3]int
và [4]int
là hai kiểu khác nhau.
Duyệt mảng:
Value type
Array trong Go là một kiểu giá trị, không phải là kiểu tham chiếu, việc gán và truyền tham số sẽ sao chép toàn bộ mảng vào một mảng mới (deep copy).
Như có thể thấy từ đầu ra, nội dung giống nhau, nhưng địa chỉ khác nhau.
Hãy xem hàm truyền tham số:
Cũng có thể thấy từ kết quả rằng trong modify
dữ liệu của mảng giữa được sửa đổi, trong main
dữ liệu của mảng không thay đổi.
Vì vậy, có thể sửa đổi nó bên trong chức năng và ảnh hưởng đến nó bên ngoài chức năng? Câu trả lời là có, slice được nói tiếp theo có thể thực hiện được.
Slice
Một slice là một loại tham chiếu có ba thuộc tính: con trỏ, độ dài và dung lượng.
- Con trỏ: Trỏ tới phần tử đầu tiên mà slice có thể truy cập.
- Độ dài: số phần tử trong slice.
- Dung lượng: số phần tử giữa phần tử bắt đầu của slice và phần tử cuối cùng của mảng tầng dưới.
Bạn có bối rối bởi lời giải thích này? Đừng hoảng sợ, hãy giải thích chi tiết.
Cấu trúc cơ bản của nó như sau:
Hãy xem một ví dụ khác để xem ý nghĩa của từng phần.
Mảng tầng dưới là một mảng chứa 10 phần tử số nguyên, data1 trỏ đến phần tử thứ 4 của mảng, độ dài là 3 và dung lượng lấy đến phần tử cuối cùng của mảng là 7. data2 trỏ đến phần tử thứ năm của mảng, độ dài là 4 và dung lượng là 6.
Create slice
Có hai cách để tạo slice:
Cách đầu tiên dựa trên array:
Cách thứ hai là sử dụng hàm built-in make
để tạo:
Sử dụng Slice
Duyệt slice
So sánh
Bạn không thể sử dụng ==
để kiểm tra xem slice có cùng thành phần hay không, nhưng các slice có thể được so sánh với con số không. Giá trị mặc định của kiểu slice là 0, cho biết rằng không có mảng tầng dưới tương ứng, đồng thời độ dài và dung lượng đều bằng 0.
Nhưng cũng lưu ý rằng nếu cả chiều dài và dung lượng đều bằng không nhưng giá trị của chúng không nhất thiết phải bằng không.
Do đó, để đánh giá xem slice có trống hay không, hãy sử dụng hàm len
thay vì so sánh xem nó có trống hay không.
Thêm phần tử
Sử dụng hàm append
.
Để nối thêm một slice khác, bạn cần thêm sau slice khác dấu ba chấm.
Sao chép
Sử dụng hàm copy
。
Reference type
Như đã nói ở trên khi giới thiệu về mảng, mảng là kiểu giá trị nên toàn bộ nội dung mảng sẽ bị sao chép khi truyền tham số, nếu mảng lớn sẽ ảnh hưởng rất nhiều đến hiệu năng. Việc truyền một slice chỉ sao chép slice đó (chỉ là một tham chiếu), điều này rất hiệu quả.
Các giá trị được sửa đổi trong modify
sẽ được ảnh hưởng luôn tới main
.